UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
12-1415dg_cli15.7. Передача дескрипторов
Когда нам требуется передать дескриптор от одного процесса другому, обычно мы выбираем одно из двух решений:
1. Дочерний процесс использует все открытые дескрипторы совместно с родительским процессом после вызова функции
fork2. Все дескрипторы обычно остаются открытыми при вызове функции
execВ первом случае процесс открывает дескриптор, вызывает функцию
forkСовременные системы Unix предоставляют способ передавать любой открытый дескриптор от одного процесса любому другому процессу. При этом вовсе не обязательно, чтобы процессы были родственными, как родительский и дочерний. Эта технология требует, чтобы мы сначала создали между двумя процессами доменный сокет Unix и затем использовали функцию
sendmsgПередача ядром 4.4BSD открытого дескриптора через доменный сокет Unix описывается в главе 18 [112].
SVR4 использует другую технологию внутри ядра для передачи открытого дескриптора: команды I_SENDFD и I_RECVFD функции ioctl, описанные в разделе 15.5.1 [110]. Но процесс все же имеет возможность доступа к указанному свойству ядра за счет доменного сокета Unix. В этой книге мы описываем применение доменных сокетов Unix для передачи открытых дескрипторов, поскольку это наиболее переносимая технология программирования: она работает как с Беркли-ядрами, так и с SVR4, в то время как команды I_SENDFD и I_RECVFD функции ioctl работают только в SVR4.
Технология 4.4BSD позволяет передавать множество дескрипторов с помощью одиночной функции sendmsg, в то время как технология SVR4 передает за один раз только один дескриптор. Во всех наших примерах за один раз передается один дескриптор.
Шаги при передаче дескриптора между процессами будут такими:
1. Создание доменного сокета Unix, или потокового сокета, или дейтаграммного сокета.
Если целью является породить с помощью функции
forksocketpairЕсли процессы не являются родственными, сервер должен создать потоковый доменный сокет Unix, связать его при помощи функции
bind2. Один процесс открывает дескриптор при помощи вызова любой из функций Unix, возвращающей дескриптор, например
openpiреmkfifosocketaccept3. Отправляющий процесс строит структуру
msghdrmsg_controlmsghdrmsg_accrightssendmsgsendmsgrecvmsg4. Принимающий процесс вызывает функцию
recvmsgКлиент и сервер должны располагать некоторым протоколом уровня приложения, с тем чтобы получатель дескриптора имел информацию о времени его появления. Если получатель вызывает функцию
recvmsgMSG_PEEKrecvmsgПример передачи дескриптора
Теперь мы представим пример передачи дескриптора. Мы напишем программу под названием
mycatopenmy_openforkexecНа рис. 15.1 показан первый шаг: наша программа
mycatsocketpairsocketpair[0][1]
