[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Ожидание изменения состояния подпроцесса - Пример 2

На следующей странице приведен другой пример использования waitid(2),
который работает так:
11   Объявляется структура siginfo_t. Она объявляется как static,
поэтому она будет проинициализирована нулями.
15-18     Запускается подпроцесс. Этот процесс спит случайное число
секунд и завершается с кодом 5. Его идентификатор сохраняется в
переменной child1.
20-21     Родительский процесс ожидает завершения определенного
подпроцесса, используя опцию WEXITED. Опция WNOHANG заставляет waitid
не приостанавливать исполнение вызвавшего процесса, если статус child1
не доступен немедленно. Эта опция используется для опроса завершения
подпроцесса. waitid возвращает ноль, если он дождался подпроцесса или
из-за опции WNOHANG.
22   Если si_pid остается нулевым, waitid возвратил управление из-за
WHOHANG. Если si_pid равен идентификатору подпроцесса, то waitid
возвратил статус этого подпроцесса.
23-27     Делается MAXTRIES попыток получить состояние завершения
подпроцесса.
28-32     После MAXTRIES попыток подпроцессу посылается сигнал
SIGKILL.
34   Распечатывается количество попыток получить статус.
35   Поле si_signo для waitid всегда будет равно SIGCLD (значение 18).
36   Поле si_code будет равно CLD_EXITED (значение 1), если подпроцесс
нормально завершился. Оно будет равно CLD_KILLED (значение 2), если
подпроцесс получил сигнал SIGKILL.
37-40     Если подпроцесс нормально завершился, si_status равен его
коду завершения. Если он был убит сигналом, si_status будет равен
номеру сигнала, вызвавшего завершение процесса. В этом случае, номер
сигнала будет SIGKILL (значение 9).
$ waitid2 parent: waiting for child 8291 sending signal to  child
tries  =  8 child signal no: 18 child signal code: 2 child signal is:
9 parent: child completed $

Файл: waitid2.c
         ОЖИДАНИЕ ИЗМЕНЕНИЯ СОСТОЯНИЯ ПОДПРОЦЕССА - ПРИМЕР 2

...
 9 main()
10 {
11     static siginfo_t stat;
...
15     if ((child1 = fork()) == 0) {
16    execl("sleeper", "sleeper", (char *) 0);
17    exit(1);
18     }
19     printf("parent: waiting for child %ld\n", child1);
20     while (waitid(P_PID, child1, &stat,
21    WNOHANG|WEXITED) != -1) {
22    if (stat.si_pid == 0) {
23        if (try < MAXTRIES) {
24       try++;
25       sleep(1);
26       continue;
27        }
28        else {
29       printf("sending signal to child\n");
30       kill(child1, SIGKILL);
31       continue;
32        }
33    }
34    printf("tries = %d\n", try);
35    printf("child signal no: %d\n", stat.si_signo);
36    printf("child signal code: %d\n", stat.si_code);
37    if (stat.si_code == CLD_EXITED)
38        printf("exit status is: %d\n", stat.si_status);
39    else
40        printf("child signal is: %d\n", stat.si_status);
41     }
42     printf("parent: child completed\n");
43 }