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

Пример на следующей странице использует waitpid(2) для отслеживания
состояние подпроцесса.
14-17     Создать подпроцесс. Сохранить его идентификатор в переменной
child1.
19-20     Запросить состояние порожденного процесса. Если состояние в
данный момент не доступно, waitpid возвратит 0. Будет сделано MAXTRIES
попыток запросить состояние потомка.
21-33     После MAXTRIES попыток получить состояние, подпроцессу
посылается сигнал SIGKILL системным вызовом kill(2).
          В строке  30  родительский  процесс  после  посылки  сигнала
          некоторое время  спит, чтобы  быть уверенным, что подпроцесс
          получил сигнал,  прежде чем  родитель вызовет waitpid(2) для
          проверки его состояния.

34-36     Если подпроцесс нормально завершился, распечатывается его
код завершения.
37-39     Если подпроцесс прервался из-за получения сигнала,
распечатывается номер сигнала.
Файл: waitpid.c
          ОЖИДАНИЕ ИЗМЕНЕНИЯ СОСТОЯНИЯ ПОДПРОЦЕССА - ПРИМЕР

...
 9 main()
10 {
...
14     if ((child1 = fork()) == 0) {
15     execl("sleeper", "sleeper", (char *) 0);
16     exit(1);
17     }
18     printf("parent: waiting for child\n");
19     while ((pid = waitpid(child1, &status, WNOHANG))
20         != -1) {
21     if (pid == 0) {
22         if (try < MAXTRIES) {
23         try++;
24         sleep(1);
25         continue;
26         }
27         else {
28         printf("sending signal to child\n");
29         kill(child1, SIGKILL);
30         sleep(1);
31         continue;
32         }
33     }
34     if (WIFEXITED(status))
35         printf("child status %d\n",
36         WEXITSTATUS(status));
37     else
38         printf("child signal %d\n",
39         WTERMSIG(status));
40     printf("tries = %d\n", try);
41     }
42     printf("parent: all children terminated\n");
43 }