Hi, all!
Подскажите как поймать завершение процесса?
Скажем:
int p = getpid(); // процесс А
pid_t pid2, pid = fork();
if ( pid == 0 )
{
if( ( pid2=fork() ) == 0 )
{ // процесс Б
char * args[] = ...;
// <- в этом месте надо вставить ожидание завершение А!
execvp("...", args);
_exit(1);
}
_exit(0);
}
waitpid(pid, NULL, 0);
Теперь процессу Б надо дождаться завершения процесса А. Функция waitpid() насколько я знаю будет действовать только для дочернего процесса.
Ожидание завершения процесса
Модератор: Модераторы разделов
-
Sparky
- Сообщения: 604
- Статус: core dumped
- ОС: Plan 9
Re: Ожидание завершения процесса
Интересено, а для чего потребовалось такое?
Впринципе могу предложить проверку на pid родителя, если 1 то родитель умер, хотя это грязное решение мне кажется.
Если найдете решение - напишите сюда - интересно, пока что поиск по Инету мне ничего не дал B)
Впринципе могу предложить проверку на pid родителя, если 1 то родитель умер, хотя это грязное решение мне кажется.
Если найдете решение - напишите сюда - интересно, пока что поиск по Инету мне ничего не дал B)
Блог
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
-
Jan2ary
- Бывший модератор
- Сообщения: 630
- Статус: Тщедушный очкарик
Re: Ожидание завершения процесса
Думаю что можно создать мьютекс, который с самого начала занят процессом А, в месте ожидания затребовать к нему доступ, а при завершении процесса А его освобождать.
В java недавно пользовался связкой wait-notify, в С уже не помню...
В java недавно пользовался связкой wait-notify, в С уже не помню...
Не шалю, никого не трогаю, починяю примус...
-
Sparky
- Сообщения: 604
- Статус: core dumped
- ОС: Plan 9
Re: Ожидание завершения процесса
(Jan2ary @ Понедельник, 28 Февраля 2005, 20:50) писал(а):В java недавно пользовался связкой wait-notify, в С уже не помню...
Не стоит путать java потоки с процессами unix, в java совсем другое системное окружение и принципы организации многопоточности тоже B)
Насчет mutex не знаю но для общения между процессами оычно создают pipe, только вот задача какая то не стандартная, хотелось бы узнать зачам такое вообще потребовалось?
И вообще как то код не красиво написан - почему например не обрабатывается случай когда fork возвращает не 0 и зачем создавать дочерний процесс а в нем еще один дочерний, при этом вы хотите ловить сигнал от процесса который не является прямым родителем процесса в котором предполагается ожидание завершения - вобщем мутно все это как то
Блог
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
-
nercus
- Сообщения: 150
Re: Ожидание завершения процесса
имхо, можно на семафорах. вполне себе подойдут.
за подробностями - man semctl, man semop, а лучше "Advanced Linux Programming: Interprocess Communications"
Код: Выделить всё
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int main(int ac, char **av) {
struct sembuf sop;
int sem;
pid_t chld;
sem = semget(IPC_PRIVATE, 1, 0600);
chld = fork();
if (chld) {
sop = (struct sembuf){0, 1, SEM_UNDO};
printf("P>\n");
sleep(2);
semop(sem, &sop, 1);
printf("P<\n");
semctl(sem, 1, IPC_RMID);
} else {
sop = (struct sembuf){0, -1, SEM_UNDO};
sleep(1);
printf("C>\n");
semop(sem, &sop, 1);
printf("C<\n");
}
return 0;
}за подробностями - man semctl, man semop, а лучше "Advanced Linux Programming: Interprocess Communications"
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
-
Jan2ary
- Бывший модератор
- Сообщения: 630
- Статус: Тщедушный очкарик
Re: Ожидание завершения процесса
Для Sparky:
Ну, я ж не говорил чтоб именно так писать и на С. Про java знаю, что у них все не так, какое-то время это меня даже бесило...
Ну, я ж не говорил чтоб именно так писать и на С. Про java знаю, что у них все не так, какое-то время это меня даже бесило...
Не шалю, никого не трогаю, починяю примус...
-
screwdriver
- Сообщения: 5
Re: Ожидание завершения процесса
Иногда действительно есть необходимость дочернему процессу дождаться завершения родителя.
Oops!..
Пример с семафорами прекрасно подходит. Спасибо!!!
Хотя есть один минус...
В моем примере (я работаю ща с чужим кодом, так что поймите) процесс, завершения которого необходимо дождаться на какомто жтапе выполнения заменяет свой код на другой функцией execvp(), освободить семафор не удасться, освободится ли он автоматически при окончании процесса? Или я чегото не понимаю?
Oops!..
Пример с семафорами прекрасно подходит. Спасибо!!!
Хотя есть один минус...
В моем примере (я работаю ща с чужим кодом, так что поймите) процесс, завершения которого необходимо дождаться на какомто жтапе выполнения заменяет свой код на другой функцией execvp(), освободить семафор не удасться, освободится ли он автоматически при окончании процесса? Или я чегото не понимаю?
-
nercus
- Сообщения: 150
Re: Ожидание завершения процесса
Для screwdriver:
Нет, семафор не освободится после окончания, а останется в системе (cat /proc/sysvipc/sem). Если в родительском процессе нет возможности поднять семафор и уничножить его (а из вашего примера этого видно не было - execvp только в процессе Б), то семафоры не подойдут.
имхо есть два варианта:
- polling - while(!kill(getppid(), 0)) usleep(100); if (ESRCH == errno){/*parent is dead*/}. не слишком хорошее решение имхо, но ничего другого в голову не приходит.
- пересмотреть дизайн программы. если это возможно конечно, то это было бы наилучшим решением.
Нет, семафор не освободится после окончания, а останется в системе (cat /proc/sysvipc/sem). Если в родительском процессе нет возможности поднять семафор и уничножить его (а из вашего примера этого видно не было - execvp только в процессе Б), то семафоры не подойдут.
имхо есть два варианта:
- polling - while(!kill(getppid(), 0)) usleep(100); if (ESRCH == errno){/*parent is dead*/}. не слишком хорошее решение имхо, но ничего другого в голову не приходит.
- пересмотреть дизайн программы. если это возможно конечно, то это было бы наилучшим решением.
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
-
Sparky
- Сообщения: 604
- Статус: core dumped
- ОС: Plan 9
Re: Ожидание завершения процесса
(screwdriver @ Вторник, 01 Марта 2005, 12:48) писал(а):Иногда действительно есть необходимость дочернему процессу дождаться завершения родителя.
Ну вы бы рассказали зачем, может кто то подскажет лучшее решение проблеммы
Блог
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
--------------------
GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
-
screwdriver
- Сообщения: 5
Re: Ожидание завершения процесса
хм... пересмотреть дизайн программы как раз таки невозможно, не буду вдаваться в подробности. К слову на данный момент я нашел обходное решение моей проблемы, не имеющее отношения к теме. Но все равно интересно, если надо подождать, когда отработает левый процесс, код которого нельзя переписать, скажем программа будет устанавливаться на разные машины с различными версиями проги, завершение которой мы ловим, как все-таки этого добиться? Если знакомы с функцией WinAPI32 WaitForSingleObject(...), она как раз и работает так, как нужно. Дочерний процесс, ожидающий завершения родителя - это только частный случай.
-
xorader
- Сообщения: 1030
- Статус: собирающий миры
- ОС: Debian
Re: Ожидание завершения процесса
поищи на google... мне тоже интересно стало - расскажешь!
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
*offtopic* - ololo!
-
screwdriver
- Сообщения: 5
Re: Ожидание завершения процесса
Google рассказал что не только у меня такие траблы. 
Но ничего конкретного по решению проблемы я не нашел.
Но ничего конкретного по решению проблемы я не нашел.