UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
int execvp(const char *<i>filename</i>, char *const <i>argv</i>[]);
<i>Все шесть функций возвращают: -1 в случае ошибки, если же функция выполнена успешно, то ничего не возвращается</i>
Эти функции возвращают вызывающему процессу значение -1, только если происходит ошибка. Иначе управление передается в начало новой программы, обычно функции
main
Отношения между этими шестью функциями показаны на рис. 4.4. Обычно только функция
execve
execve
Рис. 4.4. Отношения между шестью функциями exec
Отметим различия между этими функциями:
1. Три верхних функции (см. рис. 4.4) принимают каждую строку как отдельный аргумент, причем перечень аргументов завершается пустым указателем (так как их количество может быть различным). У трех нижних функций имеется массив
argv
2. Две функции в левой колонке получают аргумент
filename
pathname
PATH
filename
execlp
execvp
/
PATH
pathname
3. Четыре функции в двух левых колонках не получают явного списка переменных окружения. Вместо этого с помощью текущего значения внешней переменной
environ
envp
Дескрипторы, открытые в процессе перед вызовом функции
exec
fcntl
FD_CLOEXEC
inetd
4.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); /* родительский процесс закрывает
присоединенный сокет */
}
Когда соединение установлено, функция
accept
fork
connfd
listenfd
Мы предполагаем, что функция
doit
close
exit
close
В разделе 2.6 мы сказали, что вызов функции
close
close(connfd)
socket
listenfd
fork
connfd
connfd