Используйте сокет домена Unix вместо канала для любого управляющего взаимодействия между родителем и дочерним элементом. В отличие от труб, они являются двунаправленными. Если вы используете сокет дейтаграммы, каждый send()
соответствует одному recv()
и наоборот (т. Е. Границы сообщений сохраняются), что упрощает прохождение структур и тому подобное.
Дело в том, что вы можете передавать дескрипторы между процессами, используя сокет домена Unix. Справочная страница cmsg имеет пример кода.
По сути, перед тем, как вы разветвляете дочерние процессы, вы создаете уникальную для каждого дочернего процесса пару сокетов домена Unix для управления связью между родительским и дочерним процессами. Я рекомендую использовать сокет датаграмм домена Unix.
Когда родительский процесс хочет передать соединение дочернему процессу, он отправляет дочернему сообщение с вспомогательным сообщением SCM_RIGHTS
, содержащим дескриптор подключенного сокета. (Ядро будет обрабатывать детали копирования дескриптора; просто обратите внимание, что номер дескриптора может отличаться в процессе получения.)
Этот подход работает не только в Linux, но и в BSD.