UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
12-14
15
dg_cli
15.7. Передача дескрипторов
Когда нам требуется передать дескриптор от одного процесса другому, обычно мы выбираем одно из двух решений:
1. Дочерний процесс использует все открытые дескрипторы совместно с родительским процессом после вызова функции
fork
2. Все дескрипторы обычно остаются открытыми при вызове функции
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, или потокового сокета, или дейтаграммного сокета.
Если целью является породить с помощью функции
fork
socketpair
Если процессы не являются родственными, сервер должен создать потоковый доменный сокет Unix, связать его при помощи функции
bind
2. Один процесс открывает дескриптор при помощи вызова любой из функций Unix, возвращающей дескриптор, например
open
piре
mkfifo
socket
accept
3. Отправляющий процесс строит структуру
msghdr
msg_control
msghdr
msg_accrights
sendmsg
sendmsg
recvmsg
4. Принимающий процесс вызывает функцию
recvmsg
Клиент и сервер должны располагать некоторым протоколом уровня приложения, с тем чтобы получатель дескриптора имел информацию о времени его появления. Если получатель вызывает функцию
recvmsg
MSG_PEEK
recvmsg
Пример передачи дескриптора
Теперь мы представим пример передачи дескриптора. Мы напишем программу под названием
mycat
open
my_open
fork
exec
На рис. 15.1 показан первый шаг: наша программа
mycat
socketpair
socketpair
[0]
[1]