Используйте сокет, принятый родительским процессом, в дочернем процессе, созданном до принятия сокета - PullRequest
0 голосов
/ 22 января 2019

Я пишу кроссплатформенный, многопроцессорный и многопоточный сервер, используя «модель предварительного разветвления» и язык Си. В зависимости от режима (многопроцессорный или многопоточный) сервер, только что запущенный, создает набор процессов / потоков, задачей которых является обработка запросов клиентов, которые принимаются главным сервером. Поскольку дочерние процессы создаются до принятия сокета, они, очевидно, не наследуют принятый сокет. В win32 я решил, дублируя сокет. Как я могу сделать в C Linux?

1 Ответ

0 голосов
/ 22 января 2019

Используйте сокет домена Unix вместо канала для любого управляющего взаимодействия между родителем и дочерним элементом. В отличие от труб, они являются двунаправленными. Если вы используете сокет дейтаграммы, каждый send() соответствует одному recv() и наоборот (т. Е. Границы сообщений сохраняются), что упрощает прохождение структур и тому подобное.

Дело в том, что вы можете передавать дескрипторы между процессами, используя сокет домена Unix. Справочная страница cmsg имеет пример кода.

По сути, перед тем, как вы разветвляете дочерние процессы, вы создаете уникальную для каждого дочернего процесса пару сокетов домена Unix для управления связью между родительским и дочерним процессами. Я рекомендую использовать сокет датаграмм домена Unix.

Когда родительский процесс хочет передать соединение дочернему процессу, он отправляет дочернему сообщение с вспомогательным сообщением SCM_RIGHTS, содержащим дескриптор подключенного сокета. (Ядро будет обрабатывать детали копирования дескриптора; просто обратите внимание, что номер дескриптора может отличаться в процессе получения.)

Этот подход работает не только в Linux, но и в BSD.

...