Linux программирование в примерах
Шрифт:
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--; /* <<< Добавлено */
65 } else if (ret == 0) {
/* ...не изменившийся код пропущен... */
80 write(1, exited, strlen(exited));
81 }
Это идентично предыдущей версии за тем исключением, что у нас есть новая переменная,
kidsleft
, указывающая, сколько имеется не опрошенных потомков. Строки 15 и 64 помечают новый код.
83 /* main --- установка относящейся к порожденным процессам сведений
и сигналов, создание порожденных процессов */
84
85 int main(int argc, char **argv)
86 {
/* ...не
изменившийся код пропущен... */
100
101 sigemptyset(&childset);
102 sigaddset(&childset, SIGCHLD);
103
104 /* sigprocmask(SIG_SETMASK, &childset, NULL); /* блокирование в коде main */
105
106 for (nkids = 0; nkids < 5; nkids++) {
107 if ((kids[nkids] = fork) == 0) {
108 sleep(3);
109 _exit(0);
110 }
111 kidsleft++; /* <<< Added */
112 }
113
114 /* sleep(5); /* дать потомкам шанс завершиться */
115
116 while (kidsleft > 0) { /* <<< Добавлено */
117 printf("waiting for signals\n");
118 sigsuspend(&emptyset);
119 } /* <<< Добавлено */
120
121 return 0;
122 }
Здесь код также почти идентичен. Строки 104 и 114 закомментированы из предыдущей версии, а строки 111, 116 и 119 добавлены. Удивительно, при запуске поведение меняется в зависимости от версии ядра!
$ uname -a /* Отобразить версию системы */
Linux example1 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux
$ ch10-reap2 /* Запустить программу */
waiting for signals
Entered childhandler /* Опрос одного потомка */
reaped process 2702
pid 2703 not available yet
pid 2704 not available yet
pid 2705 not available yet
pid 27 06 not available yet
Exited childhandler
waiting for signals
Entered childhandler /* И следующего */
reaped process 2703
pid 2704 not available yet
pid 2705 not available yet
pid 2706 not available yet
Exited childhandler
waiting for signals
Entered childhandler /* И так далее */
reaped process 2704
Поделиться:
Популярные книги
На границе тучи ходят хмуро...
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
Кодекс Охотника. Книга III
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Последний попаданец 11. Финал. Часть 1
11. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Книга пяти колец
1. Книга пяти колец
Фантастика:
фэнтези
6.00
рейтинг книги
Поступь Империи
7. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Купидон с топором
Любовные романы:
современные любовные романы
7.67
рейтинг книги
Наследник в Зеркальной Маске
8. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Совок 5
5. Совок
Фантастика:
детективная фантастика
попаданцы
альтернативная история
6.20
рейтинг книги
Аномальный наследник. Том 1 и Том 2
1. Аномальный наследник
Фантастика:
боевая фантастика
альтернативная история
8.50
рейтинг книги
Теневой путь. Шаг в тень
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Попаданка в академии драконов 2
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Гром над Империей. Часть 2
6. Гром над миром
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Ритуал для призыва профессора
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Измена. Осколки чувств
2. Измены
Любовные романы:
современные любовные романы
5.00