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
Поделиться:
Популярные книги
Варяжская сталь: Герой. Язычник. Княжья Русь
Варяг
Фантастика:
боевая фантастика
попаданцы
альтернативная история
8.67
рейтинг книги
Предел Искушения
Фантастика:
научная фантастика
5.00
рейтинг книги
Золотая свирель
Фантастика:
фэнтези
8.04
рейтинг книги
Алхимик. Компиляция. Книги 1-9
Алхимик
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Скіфська чаша
Детективы:
криминальные детективы
5.00
рейтинг книги
"Дальние горизонты. Дух". Компиляция. Книги 1-25
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Печать пожирателя 6
6. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
фантастика: прочее
5.00
рейтинг книги
Ipso jure. /лат. «В силу закона.»
Проза:
современная проза
5.00
рейтинг книги
Суженая из другого мира
1. Суженая из другого мира
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Благие намерения
Фантастика:
фэнтези
научная фантастика
7.50
рейтинг книги
По осколкам твоего сердца
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
6.21
рейтинг книги
Жизнь внутри Наруто
1. Жизнь внутри Наруто
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Боевой кузнец. Дилогия
Древние механизмы
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
"Фантастика 2025-68". Компиляция. Книги 1-27
Фантастика 2025. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00