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

Эта программа показывает, как ожидать завершения одного подпроцесса, и
работает следующим образом:
   13-17  Создается    подпроцесс,    который    распечатывает    свой
          идентификатор, идентификатор  родительского процесса  и  код
          завершения,  который   будет  передан  exit(2)  в  следующем
          операторе.  Родительский  процесс  запоминает  идентификатор
          подпроцесса в переменной pid.
          Замечание:  Проверка   успешности  исполнения   fork(2)  для
          краткости опущена,  но на  практике  всегда  надо  проверять
          значение, возвращенное системным вызовом.

19   Родительский процесс объявляет, что он ожидает завершения своего
подпроцесса.
21   Родитель ожидает завершения порожденного подпроцесса. Может
возникнуть одна из двух ситуаций. Порожденный процесс может
завершиться раньше, чем родитель вызовет wait(2). В одном случае,
получение идентификаторов собственного и родительского процессов и их
распечатка не займет много времени. Тогда wait(2) возвращает
управление немедленно, сохранив слово состояния в своем параметре. В
другом случае, подпроцесс может начать исполнение длинной и медленной
программы. Тогда родитель прекращает исполнение (засыпает), пока
подпроцесс не завершится. Так же, как и в первом случае, формируется
слово состояния. Возвращаемое значение, идентификатор завершившегося
подпроцесса, сохраняется в переменной ret.
23   Родитель распечатывает значение, возвращенное wait(2). Оно должно
соответствовать значению, распечатанному в строке 19.
24-26     WIFEXITED возвращает ненулевое значение, если подпроцесс
завершился нормально. Затем макросом WEXITSTATUS вычисляется код
завершения подпроцесса.
28-31     WIFSIGNALED возвращает ненулевое значение, если подпроцесс
был прерван сигналом. WTERMSIG используется для вычисления номера
сигнала.
Пример демонстрируется следующим образом:
$ wait1
child: pid=10701 ppid=10700 exit_code=1
parent: waiting for child=10701
parent: return value=10701
child's exit status is: 1
Файл: wait1.c
                  ОЖИДАНИЕ ОДНОГО ПРОЦЕССА - ПРИМЕР

 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <unistd.h>
 4 #include <stdlib.h>
 5 #include <wait.h>
 6 #define EXIT_CODE 1
 7
 8 main()
 9 {
10     pid_t pid, ret;
11     int status;
12
13     if ((pid = fork()) == 0){    /* child */
14     printf("child: pid=%ld ppid=%ld exit_code=%d\n",
15         getpid(), getppid(), EXIT_CODE);
16     exit(EXIT_CODE);
17     }
18
19     printf("parent: waiting for child=%ld\n", pid);
20
21     ret = wait(&status);
22
23     printf("parent: return value=%ld\n", ret);
24     if (WIFEXITED(status))
25     printf("child's exit status is: %d\n",
26         WEXITSTATUS(status));
27     else
28     if (WIFSIGNALED(status))
29         printf("signal is: %d\n",
30         WTERMSIG(status));
31
32     exit(0);
33 }