Ожидание завершения процесса

Модератор: Модераторы разделов

screwdriver
Сообщения: 5

Ожидание завершения процесса

Сообщение screwdriver »

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: Ожидание завершения процесса

Сообщение Sparky »

Интересено, а для чего потребовалось такое?
Впринципе могу предложить проверку на 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++
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Ожидание завершения процесса

Сообщение Jan2ary »

Думаю что можно создать мьютекс, который с самого начала занят процессом А, в месте ожидания затребовать к нему доступ, а при завершении процесса А его освобождать.

В java недавно пользовался связкой wait-notify, в С уже не помню...
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: Ожидание завершения процесса

Сообщение Sparky »

(Jan2ary @ Понедельник, 28 Февраля 2005, 20:50) писал(а):В java недавно пользовался связкой wait-notify, в С уже не помню...

Не стоит путать java потоки с процессами unix, в java совсем другое системное окружение и принципы организации многопоточности тоже B)
Насчет mutex не знаю но для общения между процессами оычно создают pipe, только вот задача какая то не стандартная, хотелось бы узнать зачам такое вообще потребовалось?
И вообще как то код не красиво написан - почему например не обрабатывается случай когда fork возвращает не 0 и зачем создавать дочерний процесс а в нем еще один дочерний, при этом вы хотите ловить сигнал от процесса который не является прямым родителем процесса в котором предполагается ожидание завершения - вобщем мутно все это как то :blink:
Блог
--------------------

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: Ожидание завершения процесса

Сообщение nercus »

имхо, можно на семафорах. вполне себе подойдут.

Код: Выделить всё

#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 | ДДТ
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: Ожидание завершения процесса

Сообщение Jan2ary »

Для Sparky:
Ну, я ж не говорил чтоб именно так писать и на С. Про java знаю, что у них все не так, какое-то время это меня даже бесило...
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
screwdriver
Сообщения: 5

Re: Ожидание завершения процесса

Сообщение screwdriver »

Иногда действительно есть необходимость дочернему процессу дождаться завершения родителя.

Oops!..
Пример с семафорами прекрасно подходит. Спасибо!!! :)

Хотя есть один минус...
В моем примере (я работаю ща с чужим кодом, так что поймите) процесс, завершения которого необходимо дождаться на какомто жтапе выполнения заменяет свой код на другой функцией execvp(), освободить семафор не удасться, освободится ли он автоматически при окончании процесса? Или я чегото не понимаю?
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Ожидание завершения процесса

Сообщение nercus »

Для screwdriver:
Нет, семафор не освободится после окончания, а останется в системе (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 | ДДТ
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: Ожидание завершения процесса

Сообщение Sparky »

(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++
Спасибо сказали:
screwdriver
Сообщения: 5

Re: Ожидание завершения процесса

Сообщение screwdriver »

хм... пересмотреть дизайн программы как раз таки невозможно, не буду вдаваться в подробности. К слову на данный момент я нашел обходное решение моей проблемы, не имеющее отношения к теме. Но все равно интересно, если надо подождать, когда отработает левый процесс, код которого нельзя переписать, скажем программа будет устанавливаться на разные машины с различными версиями проги, завершение которой мы ловим, как все-таки этого добиться? Если знакомы с функцией WinAPI32 WaitForSingleObject(...), она как раз и работает так, как нужно. Дочерний процесс, ожидающий завершения родителя - это только частный случай.
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Ожидание завершения процесса

Сообщение xorader »

поищи на google... мне тоже интересно стало - расскажешь!
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
screwdriver
Сообщения: 5

Re: Ожидание завершения процесса

Сообщение screwdriver »

Google рассказал что не только у меня такие траблы. :)
Но ничего конкретного по решению проблемы я не нашел.
Спасибо сказали: