Шрифт:
15.7. Передача дескрипторов
Когда нам требуется передать дескриптор от одного процесса другому, обычно мы выбираем одно из двух решений:
1. Дочерний процесс использует все открытые дескрипторы совместно с родительским процессом после вызова функции
2. Все дескрипторы обычно остаются открытыми при вызове функции
В первом случае процесс открывает дескриптор, вызывает функцию
Современные системы Unix предоставляют способ передавать любой открытый дескриптор от одного процесса любому другому процессу. При этом вовсе не обязательно, чтобы процессы были родственными, как родительский и дочерний. Эта технология требует, чтобы мы сначала создали между двумя процессами доменный сокет Unix и затем использовали функцию
Передача ядром 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, или потокового сокета, или дейтаграммного сокета.
Если целью является породить с помощью функции
Если процессы не являются родственными, сервер должен создать потоковый доменный сокет Unix, связать его при помощи функции