UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Чтобы обработать прерванный вызов функции
accept
accept
for
for (;;) {
clilen = sizeof(cliaddr);
if ((connfd = accept(listenfd, (SA*)&cliaddr, &clilen)) < 0) {
if (errno == EINTR)
continue; /* назад в for() */
else
err_sys("accept error");
}
Обратите внимание, что мы вызываем функцию
accept
Accept
В этой части кода мы сами перезапускаем прерванный системный вызов. Это допустимо для функции
accept
read
write
select
open
connect
EINTR
select
5.10. Функции wait и waitpid
В листинге 5.7 мы вызываем функцию
wait
#include <sys/wait.h>
pid_t wait(int *<i>statloc</i>);
pid_t waitpid(pid_t <i>pid</i>, int *<i>statloc</i>, int <i>options</i>);
<i>Обе функции возвращают ID процесса в случае успешного выполнения, -1 в случае ошибки</i>
Обе функции, и
wait
waitpid
statloc
WIFEXITED
WEXITSTATUS
Если у процесса, вызывающего функцию
wait
wait
Функция
waitpid
pid
options
WNOHANG
Различия между функциями wait и waitpid
Теперь мы проиллюстрируем разницу между функциями
wait
waitpid
sockfd[0]
str_cli
Рис. 5.2. Клиент, установивший пять соединений с одним и тем же параллельным сервером
Листинг 5.7. Клиент TCP, устанавливающий пять соединений с сервером
/
/tcpcliserv/tcpcli04.c
1 #include "unp.h"
2 int
3 main(int argc, char **argv)
4 {
5 int i, sockfd[5];
6 struct sockaddr_in servaddr;
7 if (argc != 2)
8 err_quit("usage: tcpcli <Ipaddress>");
9 for (i = 0; i < 5; i++) {
10 sockfd[i] = Socket(AF_INET, SOCK_STREAM, 0);
11 bzero(&servaddr, sizeof(servaddr));
12 servaddr.sin_family = AF_INET;
13 servaddr.sin_port = htons(SERV_PORT);
14 Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
15 Connect(sockfd[i], (SA*)&servaddr, sizeof(servaddr));
16 }
17 str_cli(stdin, sockfd[0]); /* эта функция выполняет все необходимые
действия для формирования запроса клиента */
18 exit(0);
19 }
Когда клиент завершает работу, все открытые дескрипторы автоматически закрываются ядром (мы не вызываем функцию close
,
exit
SIGCHLD