UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
int execvp(const char *<i>filename</i>, char *const <i>argv</i>[]);<i>Все шесть функций возвращают: -1 в случае ошибки, если же функция выполнена успешно, то ничего не возвращается</i>Эти функции возвращают вызывающему процессу значение -1, только если происходит ошибка. Иначе управление передается в начало новой программы, обычно функции
mainОтношения между этими шестью функциями показаны на рис. 4.4. Обычно только функция
execveexecve
Рис. 4.4. Отношения между шестью функциями exec
Отметим различия между этими функциями:
1. Три верхних функции (см. рис. 4.4) принимают каждую строку как отдельный аргумент, причем перечень аргументов завершается пустым указателем (так как их количество может быть различным). У трех нижних функций имеется массив
argv2. Две функции в левой колонке получают аргумент
filenamepathnamePATHfilenameexeclpexecvp/PATHpathname3. Четыре функции в двух левых колонках не получают явного списка переменных окружения. Вместо этого с помощью текущего значения внешней переменной
environenvpДескрипторы, открытые в процессе перед вызовом функции
execfcntlFD_CLOEXECinetd4.8. Параллельные серверы
Сервер, представленный в листинге 4.2, является последовательным (итеративным) сервером. Для такого простого сервера, как сервер времени и даты, это допустимо. Но когда обработка запроса клиента занимает больше времени, мы не можем связывать один сервер с одним клиентом, поскольку нам хотелось бы обрабатывать множество клиентов одновременно. Простейшим способом написать параллельный сервер под Unix является вызов функции
forkЛистинг 4.3. Типичный параллельный сервер
pid_t pid;int listenfd, connfd;listenfd = Socket( ... );/* записываем в sockaddr_in{} параметры заранее известного порта сервера */Bind(listenfd, ... );Listen(listenfd, LISTENQ);for (;;) { connfd = Accept(listenfd, ...); /* вероятно, блокировка */ if ((pid = Fork() == 0) { Close(listenfd); /* дочерний процесс закрывает прослушиваемый сокет */ doit(connfd); /* обработка запроса */ Close(connfd); /* с этим клиентом закончено */ exit(0); /* дочерний процесс завершен */ } Close(connfd); /* родительский процесс закрывает присоединенный сокет */}Когда соединение установлено, функция
acceptforkconnfdlistenfdМы предполагаем, что функция
doitcloseexitcloseВ разделе 2.6 мы сказали, что вызов функции
closeclose(connfd)socketlistenfdforkconnfdconnfd
