Чтение онлайн

на главную - закладки

Жанры

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--; /* <<< Добавлено */

Поделиться:
Популярные книги

Страх

Рыбаков Анатолий Наумович
2. Дети Арбата
Проза:
историческая проза
9.49
рейтинг книги
Страх

Дважды одаренный. Том VIII

Тарс Элиан
8. Дважды одаренный
Фантастика:
боевая фантастика
альтернативная история
аниме
попаданцы
5.00
рейтинг книги
Дважды одаренный. Том VIII

Мастер Трав III

Мордорский Ваня
3. Мастер Трав
Фантастика:
фэнтези
рпг
фантастика: прочее
попаданцы
5.75
рейтинг книги
Мастер Трав III

Старый, но крепкий 2

Крынов Макс
2. Культивация без насилия
Фантастика:
рпг
уся
эпическая фантастика
5.00
рейтинг книги
Старый, но крепкий 2

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Тринадцатый XIII

NikL
13. Видящий смерть
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Тринадцатый XIII

Лекарь Империи 2

Карелин Сергей Витальевич
2. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 2

Хозяин Стужи 7

Петров Максим Николаевич
7. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 7

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Мой муж – чудовище! Изгнанная жена дракона

Терин Рем
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Мой муж – чудовище! Изгнанная жена дракона

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Изгой Проклятого Клана. Том 3

Пламенев Владимир
3. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 3

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4