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

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

Жанры

UNIX: разработка сетевых приложений
Шрифт:

4 int

5 main(int argc, char **argv)

6 {

7 int listenfd, i;

8 socklen_t addrlen;

9 void sig_int(int);

10 pid_t child_make(int, int, int);

11 if (argc == 3)

12 listenfd = Tcp_listen(NULL, argv[1], &addrlen);

13 else if (argc == 4)

14 listenfd = Tcp_listen(argv[1], argv[2], &addrlen);

15 else

16 err_quit("usage: serv02 [ <host> ] <port#> <#children>");

17 nchildren = atoi(argv[argc - 1]);

18 pids = Calloc(nchildren, sizeof(pid_t));

19 for (i = 0; i < nchildren; i++)

20 pids[i] = child_make(i, listenfd, addrlen); /*
возвращение родительского процесса */

21 Signal (SIGINT, sig_int);

22 for (;;)

23 pause; /* дочерние процессы завершились */

24 }

11-18
Дополнительный аргумент командной строки указывает, сколько требуется создать дочерних процессов. В памяти выделяется место для размещения массива, в который записываются идентификаторы дочерних процессов, используемые функцией
main
при окончании работы программы для завершения этих процессов.

19-20
Каждый дочерний процесс создается функцией
child_make
, которую мы показываем в листинге 30.8.

Код обработчика сигнала

SIGINT
, представленный в листинге 30.7, отличается от кода, приведенного в листинге 30.3.

Листинг 30.7. Обработчик сигнала SIGINT

//server/serv02.c

25 void

26 sig_int(int signo)

27 {

28 int i;

29 void pr_cpu_time(void);

30 /* завершаем все дочерние процессы */

31 for (i = 0; i < nchildren; i++)

32 kill(pids[i], SIGTERM);

33 while (wait(NULL) > 0) /* ждем завершения всех дочерних процессов */

34 ;

35 if (errno != ECHILD)

36 err_sys("wait error");

37 pr_cpu_time;

38 exit(0);

39 }

30-34
Функция
getrusage
сообщает об использовании ресурсов всеми дочерними процессами, завершившимисвое выполнение,
поэтому мы должны завершить все дочерние процессы к моменту вызова функции
pr_cpu_time
. Для этого дочерним процессам посылается сигнал
SIGTERM
, после чего мы вызываем функцию
wait
и ждем завершения выполнения дочерних процессов.

В листинге 30.8 показана функция

child_make
, вызываемая из функции main для порождения очередного дочернего процесса.

Листинг 30.8. Функция child_make: создание очередного дочернего процесса

//server/child02.c

1 #include "unp.h"

2 pid_t

3 child_make(int i, int listenfd, int addrlen)

4 {

5 pid_t pid;

6 void child_main(int, int, int);

7 if ( (pid = Fork) > 0)

8 return (pid); /* родительский процесс */

9 child_main(i, listenfd, addrlen); /* никогда не завершается */

10 }

7-9
Функция
fork
создает очередной дочерний процесс и возвращает родителю идентификатор дочернего процесса. Дочерний процесс вызывает функцию
child_main
, показанную в листинге 30.9, которая представляет собой бесконечный цикл.

Листинг 30.9. Функция child_main: бесконечный цикл, выполняемый каждым дочерним процессом

//server/child02.c

11 void

12 child_main(int i, int listenfd, int addrlen)

13 {

14 int connfd;

15 void web_child(int);

16 socklen_t clilen;

17 struct sockaddr *cliaddr;

18 cliaddr = Malloc(addrlen);

19 printf("child %ld starting\n", (long)getpid);

20 for (;;) {

21 clilen = addrlen;

22 connfd = Accept(listenfd, cliaddr, &clilen);

23 web_child(connfd); /* обработка запроса */

24 Close(connfd);

25 }

26 }

20-25
Каждый дочерний процесс вызывает функцию
accept
, и когда она завершается, функция
web_child
(см. листинг 30.5) обрабатывает клиентский запрос. Дочерний процесс продолжает выполнение цикла, пока родительский процесс не завершит его.

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

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

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

Меллер Юлия Викторовна
1. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Дуняша

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

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

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

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

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

Невест так много. Дилогия

Завойчинская Милена
Невест так много
Любовные романы:
любовно-фантастические романы
7.62
рейтинг книги
Невест так много. Дилогия

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Наследник павшего дома. Том I

Вайс Александр
1. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том I

Крещение огнем

Сапковский Анджей
5. Ведьмак
Фантастика:
фэнтези
9.40
рейтинг книги
Крещение огнем

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая