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

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

Жанры

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]));

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

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
7.33
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Я уже бог. Книга XL

Дрейк Сириус
40. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже бог. Книга XL

Войны мафии

Уоллер Лесли
Детективы:
триллеры
5.75
рейтинг книги
Войны мафии

Досье Дрездена. Книги 1 - 15

Батчер Джим
Досье Дрездена
Фантастика:
фэнтези
ужасы и мистика
5.00
рейтинг книги
Досье Дрездена. Книги 1 - 15

Матабар IX

Клеванский Кирилл Сергеевич
9. Матабар
Проза:
магический реализм
5.00
рейтинг книги
Матабар IX

Алчность. Жажда магии

Post Mort
Фантастика:
фэнтези
5.00
рейтинг книги
Алчность. Жажда магии

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
4.75
рейтинг книги
Монстр из прошлого тысячелетия

Неучтенный элемент. Том 9

NikL
9. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 9

Перевертыш. Часть 3

Гаркавый Владимир Александрович
Вселенная EVE Online
Фантастика:
боевая фантастика
5.00
рейтинг книги
Перевертыш. Часть 3

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
Наша навсегда

Хроники странного королевства. Шаг из-за черты. Дилогия

Панкеева Оксана Петровна
73. В одном томе
Фантастика:
фэнтези
9.15
рейтинг книги
Хроники странного королевства. Шаг из-за черты. Дилогия

Стрелок. Извлечение троих. Бесплодные земли

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

Вечный слушатель

Уайльд Оскар
2013. Антология поэзии
Поэзия:
поэзия
5.00
рейтинг книги
Вечный слушатель