Подтвердить что ты не робот

Портативный способ передачи файлового дескриптора между различными процессами

В большинстве систем UNIX передача открытого файла между процессами может быть легко выполнена для дочерних/родительских процессов fork(); однако мне нужно поделиться fd "после", ребенок уже был разветвлен.

Я нашел несколько веб-страниц, сообщающих мне, что sendmsg() может работать для суровых процессов; но это кажется очень зависимым от ОС и сложным. portlisten кажется лучшим примером, который я могу найти, но я бы предпочел хорошую библиотеку-обертку, такую ​​как libevent, которая скрывает всю магию kqueue, пула,....

Кто-нибудь знает, есть ли какая-нибудь библиотека (и переносная) для этого?

4b9b3361

Ответ 1

Я нашел (с другого вопроса) хорошую библиотеку: libancillary. Это просто то, что мне нужно!

Ответ 2

Лучше всего попробовать отправить файловый дескриптор поверх сокета домена Unix. Это описано в Stephens, и в нескольких местах в Интернете, но я могу выкопать код для вас, если вы спросите красиво.

В наши дни это будет довольно портативно; многие вещи, которые считаются "не переносимыми" назад, когда (например, mmap !) являются чрезвычайно распространенными сейчас. Если вам нужно быть более портативными, чем "большинство систем в наши дни", у вас впереди много интересных вопросов, но, возможно, если вы расскажете нам больше о том, что вы делаете, и о том, на каких платформах вы работаете ( возможно, не-Unix POSIX-платформы?), мы могли бы помочь.

Ответ 3

Существует механизм доступа на основе сокетов на основе Unix для передачи файловых дескрипторов (таких как сокеты, которые не могут быть отображены в памяти, конечно) между процессами - с использованием системного вызова sendmsg().

Вы можете найти больше в Stevens (как упоминал Курт Сампсон), а также в Wikipedia.

Вы можете найти гораздо более свежий вопрос с рабочим кодом в Отправка файлового дескриптора сокета Linux.