[<<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 }