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

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

Жанры

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

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

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Сокрушитель

Поселягин Владимир Геннадьевич
3. Уникум
Фантастика:
боевая фантастика
5.60
рейтинг книги
Сокрушитель

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

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

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Я все еще царь. Книга XXXI

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

Неудержимый. Книга XXX

Боярский Андрей
30. Неудержимый
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXX

Интриганка

Шелдон Сидни
Приключения:
исторические приключения
9.24
рейтинг книги
Интриганка

Последний Герой. Том 2

Дамиров Рафаэль
2. Последний герой
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Последний Герой. Том 2

Кодекс Крови. Книга ХVII

Борзых М.
17. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVII

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Эпоха Опустошителя. Том III

Павлов Вел
3. Вечное Ристалище
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эпоха Опустошителя. Том III

Черный Маг Императора 9

Герда Александр
9. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 9

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Вернувшийся: Посол. Том IV

Vector
4. Вернувшийся
Фантастика:
космическая фантастика
киберпанк
5.00
рейтинг книги
Вернувшийся: Посол. Том IV