[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Принудительное завершение подпроцессов - пример

Этот пример показывает, каким образом вы можете убить несколько
порожденных вами процессов, если один из них возвращает плохой  код.
13-17          Запускаются пять подпроцессов, и их идентификаторы
          записываются в chpid[].

19-26          wait(2) в цикле ожидает завершения всех подпроцессов.

22-25          Если какой-то  из  подпроцессов  завершается  с  плохим
          статусным  кодом, то все остальные принудительно завершаются
          посылкой сигнала  SIGTERM. Заметьте,  что сигнал  посылается
          также тому  процессу, который  только что завершился, но это
          не причиняет  вреда. Внутри цикла каждый порожденный процесс
          ожидается индивидуально, повторяющимися вызовами wait(2).

Эта программа исполняется каждым из подпроцессов. Каждому из них
требуется различное время для того, чтобы завершиться. Различное время
выполнения изображается вызовом библиотечной функции sleep(3C).
sleep(3C) будет описано ниже. Каждый процесс спит случайное количество
времени.
Замечание: сначала генератор случайных чисел должен быть
инициализирован  с использованием srand(3C), после чего rand(3C)
выдает случайные числа. См. rand(3C) для более детального знакомства.

Рассмотрите выполнение этого примера. Получилось так, что порожденный
процесс номер четыре завершился первым, с кодом выхода равным 1
(status равен 256). Поэтому остальные подпроцессы будут завершены
сигналом SIGTERM. Заметьте, что здесь печатается несдвинутый статусный
код.
Это программа, которую исполняют порожденные процессы:

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

$ parent
parent: waiting for children
child 9725: terminated, status: 256
child 9722: terminated, status: 15
child 9723: terminated, status: 15
child 9724: terminated, status: 15
child 9726: terminated, status: 15
parent: all children terminated

Файлы: parent.c и child.c
           ПРИНУДИТЕЛЬНОЕ ЗАВЕРШЕНИЕ ПОДПРОЦЕССОВ - ПРИМЕР
1    #include <sys/types.h>
2    #include <sys/signal.h>
3    #include <sys/procset.h>
4    #include <unistd.h>
5    #include <wait.h>
6    #define  NUMCHILD 5
7
8    main(int argc, char **argv)
9    {
10      int i, status;
11      pid_t pid, chpid[NUMCHILD];
12
13      for (i = 0; i < NUMCHILD; i++) {
14          if ((pid = fork()) == 0)
15              execlp("child","child",(char*) 0);
16          chpid[i] = pid;
17      }
18      printf("parent: waiting for children\n");
19      while ((pid = wait(&status)) != -1) {
20          printf("child %d: terminated, status:
21                            %d\n", pid, status);
22          if (WEXITSTATUS(status) != 0) {
23               for (i = 0; i < NUMCHILD; i++)
24                     sigsend(P_PID, chpid[i], SI
25          }
26      }
27      printf("parent: all children terinated\n")
28
29      exit(0);
30   }