Linux программирование в примерах
Шрифт:
Строки 71–76 обрабатывают любую другую ошибку, выводя соответствующее сообщение об ошибке.
81 /* main --- установка связанных с порожденными процессами сведений и сигналов, создание порожденных процессов */
82
83 int main(int argc, char **argv)
84 {
85 struct sigaction sa;
86 sigset_t childset, emptyset;
87 int i;
88
89 for (i = 0; i < nkids; i++)
90 kids[i] = NOT_USED;
91
92 sigemptyset(&emptyset);
93
94 sa.sa_flags =
SA_NOCLDSTOP;
95 sa.sa_handler = childhandler;
96 sigfillset(&sa.sa_mask); /*
блокировать все при вызове обработчика */
97 sigaction(SIGCHLD, &sa, NULL);
98
99 sigemptyset(&childset);
100 sigaddset(&childset, SIGCHLD);
101
102 sigprocmask(SIG_SETMASK, &childset, NULL); /* блокировать его в коде main */
103
104 for (nkids = 0; nkids < 5; nkids++) {
105 if ((kids[nkids] = fdrk) == 0) {
106 sleep(3);
107 _exit(0);
108 }
109 }
110
111 sleep(5); /* дать потомкам возможность завершения */
112
113 printf("waiting for signal\n");
114 sigsuspend(&emptyset);
115
116 return 0;
117 }
Строки 89–90 инициализируют
kids
. Строка 92 инициализирует emptyset
. Строки 94–97 настраивают и устанавливают обработчик сигнала для SIGCHLD
. Обратите внимание на использование в строке 94 SA_NOCLDSTOP
, тогда как строка 96 блокирует все сигналы при вызове обработчика. Строки 99–100 создают набор сигналов, представляющих
SIGCHLD
, а строка 102 устанавливает их в качестве маски сигналов процесса для программы. Строки 104–109 создают пять порожденных процессов, каждый из которых засыпает на три секунды. По ходу дела они обновляют массив
kids
и переменную nkids
. Строка 111 дает затем потомкам шанс завершиться, заснув на еще больший промежуток времени. (Это не гарантирует, что порожденные процессы завершатся, но шансы довольно велики.)
Наконец, строки 113–114 выводят сообщение и приостанавливаются, заменив маску сигналов процесса, блокирующую
SIGCHLD
, пустой маской. Это дает возможность появиться сигналу SIGCHLD
,
$ ch10-reap1 /* Запуск программы */
waiting for signal
Entered childhandler
reaped process 23937
reaped process 23938
reaped process 23939
reaped process 23940
reaped process 23941
Exited childhandler
Обработчик сигнала собирает сведения о потомках за один проход.
Следующая программа,
ch10-reap2.c
, сходна с ch10-reap1.c
. Разница в том, что она допускает появление сигнала SIGCHLD
в любое время. Такое поведение увеличивает шанс получения более одного SIGCHLD
, но не гарантирует это. В результате обработчик сигнала все равно должен быть готов обработать в цикле несколько потомков. 1 /* ch10-reap2.c — демонстрирует управление SIGCHLD, один сигнал на потомка */
2
/* ...не изменившийся код пропущен... */
12
13 pid_t kids[MAX_KIDS];
14 size_t nkids = 0;
15 size_t kidsleft = 0; /* <<< Добавлено */
16
/* ...не изменившийся код пропущен... */
41
42 /* childhandler --- перехват SIGCHLD, опрос всех доступных потомков */
43
44 void childhandler(int sig)
45 {
46 int status, ret;
47 int i;
48 char buf[100];
49 static const char entered[] = "Entered childhandler\n";
50 static const char exited[] = "Exited childhandler\n";
51
52 write(1, entered, strlen(entered));
53 for (i = 0; i < nkids; i++) {
54 if (kids[i] == NOT_USED)
55 continue;
56
57 retry:
58 if ((ret = waitpid(kids[i], &status, WNOHANG)) == kids[i]) {
59 strcpy(buf, "\treaped process ");
60 strcat(buf, format_num(ret));
61 strcat(buf, "\n");
62 write(1, buf, strlen(buf));
63 kids[i] = NOT_USED;
64 kidsleft--; /* <<< Добавлено */
Поделиться:
Популярные книги
Великий род
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Первый среди равных. Книга III
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Меченный смертью. Том 1
1. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мастер 8
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Тихие ночи
2. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 2
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
Двойник короля 18
18. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Наследник в Зеркальной Маске
8. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, демоненок! Том 3
3. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Дважды одаренный. Том VI
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
Ваше Сиятельство
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Бастард Бога (Дилогия)
Фантастика:
альтернативная история
5.11
рейтинг книги
Патрульный
2. Наемник
Фантастика:
боевая фантастика
космическая фантастика
8.42
рейтинг книги
Я уже граф. Книга VII
7. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00