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