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) обрабатывает клиентский запрос. Дочерний процесс продолжает выполнение цикла, пока родительский процесс не завершит его.
Поделиться:
Популярные книги
Воевода
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Девятый
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Совершенный: пробуждение
1. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Кодекс Крови. Книга Х
10. РОС: Кодекс Крови
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Дайте поспать! Том IV
4. Вечный Сон
Фантастика:
городское фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Ротмистр Гордеев
1. Ротмистр Гордеев
Фантастика:
фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Как я строил магическую империю 2
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Тройняшки не по плану. Идеальный генофонд
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Специалист
17. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Не грози Дубровскому! Том IX
9. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга III
3. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Изгой. Пенталогия
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Жена по ошибке
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Пистоль и шпага
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28