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

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

Жанры

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

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

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

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

Жена неверного ректора Полицейской академии

Удалова Юлия
Любовные романы:
любовно-фантастические романы
4.25
рейтинг книги
Жена неверного ректора Полицейской академии

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

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

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Я уже барон

Дрейк Сириус
2. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже барон

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

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

Боярышня Дуняша 2

Меллер Юлия Викторовна
2. Боярышня
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Боярышня Дуняша 2

Трое с площади Карронад

Крапивин Владислав Петрович
Детские:
детские приключения
9.10
рейтинг книги
Трое с площади Карронад

Вернувшийся: Корпорация. Том III

Vector
3. Вернувшийся
Фантастика:
космическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Корпорация. Том III

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Тринадцатый

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

Я спас СССР! том 2

Вязовский Алексей
2. Я спас СССР
Фантастика:
альтернативная история
5.62
рейтинг книги
Я спас СССР! том 2

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец