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

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

Жанры

Linux программирование в примерах
Шрифт:

Как и с сигналами в общем, описанные здесь интерфейсы и механизмы сложны, поскольку они развивались с течением времени.

10.8.3.1. Плохие родители: полное игнорирование потомков

Простейшим действием, которое вы можете сделать, является изменение действия для

SIGCHLD
на
SIG_IGN
. В этом случае завершившиеся потомки не становятся зомби. Вместо этого статус их завершения отбрасывается, и они полностью удаляются из системы.

Другой возможностью, дающей такой же результат, является использование флага

SA_NOCLDWAIТ
. В коде:

/* Старый стиль: */ /* Новый стиль: */

signal(SIGCHLD, SIG_IGN); struct sigaction sa;

sa.sa_handler = SIG_IGN;

sa.sa_flags = SA_NOCLDWAIT;

sigemptyset(&sa.sa_mask);

sigaction(SIGCHLD, &sa, NULL);

10.8.3.2. Снисходительные родители: минимальный надзор

В качестве альтернативы можно беспокоиться лишь о завершении потомка и не интересоваться простыми изменениями состояния (остановке и возобновлении). В этом случае используйте флаг

SA_NOCLDSTOP
и установите обработчик сигнала, вызывающий
wait
(или родственную ей функцию) для получения данных процесса.

В общем вы не можете ожидать получать по одному сигналу

SIGCHLD
на каждого завершающегося потомка. Следует считать, что
SIGCHLD
означает «завершился по крайней мере один потомок» и быть готовым собрать при обработке
SIGCHLD
сведения о как можно большем числе потомков.

Следующая программа,

ch10-reap1.с
, блокирует
SIGCHLD
до тех пор, пока не будет готова восстановить потомков.

1 /* ch10-reap1.с --- демонстрирует управление SIGCHLD с использованием цикла */

2

3 #include <stdio.h>

4 #include <errno.h>

5 #include <signal.h>

6 #include <string.h>

7 #include <sys/types.h>

8 #include <sys/wait.h>

9

10 #define MAX_KIDS 42

11 #define NOT_USED -1

12

13 pid_t kids[MAX_KIDS];

14 size_t nkids = 0;

Массив потомков отслеживает ID порожденных процессов. Если элемент содержит

NOT_USED
, он не представляет необработанного потомка. (Его инициализируют строки 89–90 внизу)
nkids
указывает, сколько значений в
kids
следует проверить.

16 /* format_num --- вспомогательная функция, поскольку нельзя использовать [sf]printf */

17

18 const char *format_num(int num)

19 {

20 #define NUMSIZ 30

21 static char buf[NUMSIZ];

22 int i;

23

24 if (num <= 0) {

25 strcpy(buf, "0");

26 return buf;

27 }

28

29 i = NUMSIZ - 1;

30 buf[i--] = '\0';

31

32 /* Преобразует цифры обратно в строку. */

33 do {

34 buf[i--] = (num % 10) + '0';

35 num /= 10;

36 } while (num > 0);

37

38 return &buf[i+1];

39 }

Поскольку обработчики сигналов не должны вызывать функции семейства

printf
, мы предусмотрели для преобразования десятичного сигнала или номера PID в строку простую «вспомогательную» функцию
format_num
. Это примитивно, но работает.

41 /* childhandler --- перехват SIGCHLD, сбор сведений со всех доступных потомков */

42

43 void childhandler(int sig)

44 {

45 int status, ret;

46 int i;

47 char buf[100];

48 static const char entered[] = "Entered childhandler\n" ;

49 static const char exited[] = "Exited childhandler\n";

50

51 writed, entered, strlen(entered));

52 for (i =0; i < nkids; i++) {

53 if (kids[i] == NOT_USED)

54 continue;

55

56 retry:

57 if ((ret = waitpid(kids[i], &status, WNOHANG)) == kids[i]) {

58 strcpy(buf, "\treaped process ");

59 strcat(buf, format_num(ret));

60 strcat(buf, "\n");

61 write(1, buf, strlen(buf));

62 kids[i] = NOT_USED;

63 } else if (ret == 0) {

64 strcpy(buf, "\tpid ");

65 strcat(buf, format_num(kids[i]));

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

Собрание сочинений в 15 томах. Том 7

Уэллс Герберт Джордж
Фантастика:
научная фантастика
5.00
рейтинг книги
Собрание сочинений в 15 томах. Том 7

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Избранное

Зощенко Михаил Михайлович
Фантастика:
альтернативная история
8.00
рейтинг книги
Избранное

Последний Паладин. Том 14

Саваровский Роман
14. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Последний Паладин. Том 14

Том 22. Письма 1890-1892

Чехов Антон Павлович
22. Полное собрание сочинений в тридцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 22. Письма 1890-1892

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Песчаный дьявол

Роллинс Джеймс
1. Отряд «Сигма»
Приключения:
прочие приключения
8.87
рейтинг книги
Песчаный дьявол

Victory значит победа

Tora_san
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Victory значит победа

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2

Барбаросса

Пикуль Валентин Саввич
Проза:
историческая проза
8.88
рейтинг книги
Барбаросса

Круг чтения. Афоризмы и наставления

Толстой Лев Николаевич
Золотой фонд эзотерики
Проза:
афоризмы
5.00
рейтинг книги
Круг чтения. Афоризмы и наставления

Рыцарь Империи

Буревой Андрей
3. Одержимый
Фантастика:
фэнтези
9.39
рейтинг книги
Рыцарь Империи

Кортни. 1-13

Смит Уилбур
Кортни
Приключения:
исторические приключения
прочие приключения
5.00
рейтинг книги
Кортни. 1-13

Книга драконов

Страуд Джонатан
Фантастика:
фэнтези
героическая фантастика
юмористическая фантастика
7.50
рейтинг книги
Книга драконов