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

Следующая страница показывает пример использования waitid(2), который
работает следующим образом:
10   Объявляется структура siginfo_t.
12-15     Запускается подпроцесс. Этот процесс спит случайное число
секунд, а затем завершается с кодом 5.
          sleeper.c:

            1 #include <sys/types.h>
            2 #include <unistd.h>
            3 #include <stdlib.h>
            4
            5 main()
            6 {
            7 srand(getpid());
            8 sleep(rand()%10 +1);
            9 exit(5);
           10 }

17   Родитель ожидает завершения всех своих потомков, используя опции
P_ALL и WEXITED.
18   Для значения, сформированного waitid(2), поле si_signo всегда
будет равно SIGCLD (значение 18).
19   Значения si_code, связанные с SIGCLD, определены в
<sys/siginfo.h>. Эти значения таковы:
          #define CLD_EXITED      1       /* child has exited */
          #define CLD_KILLED      2       /* child was killed */
          #define CLD_DUMPED      3       /* child has coredumped */
          #define CLD_TRAPPED     4       /* traced child has stopped
          */
          #define CLD_STOPPED     5       /* child has stopped on
          signal */
          #define CLD_CONTINUED   6       /* stopped child has
          continued */

20   Если si_signo равно SIGCLD и si_code равно CLD_EXITED, то
si_status будет равно коду завершения подпроцесса. Иначе, если
si_signo равно SIGCLD, а si_code не равно CLD_EXITED, то si_status
будет равно номеру сигнала, который вызвал изменение состояния
процесса. В этом примере подпроцесс нормально завершается с кодом 5,
так что si_status имеет значение 5.
$ waitid parent: waiting for child : 8370  child  signal  no:  18
child signal code: 1 child status: 5 parent: child completed $

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

 1 #include <sys/types.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 #include <wait.h>
 5 #include <stdio.h>
 6
 7 main()
 8 {
 9     pid_t child1;
10     siginfo_t status;
11
12     if ((child1 = fork()) == 0) {
13     execl("sleeper", "sleeper", (char *) 0);
14     exit(1);
15     }
16     printf("parent: waiting for child : %ld\n",child1);
17     waitid(P_ALL, 0, &status, WEXITED);
18     printf("child signal no: %d\n", status.si_signo);
19     printf("child signal code: %d\n", status.si_code);
20     printf("child status: %d\n", status.si_status);
21
22     printf("parent: child completed\n");
23 }