Ответ 1
Я нашел (с другого вопроса) хорошую библиотеку: libancillary. Это просто то, что мне нужно!
В большинстве систем UNIX передача открытого файла между процессами может быть легко выполнена для дочерних/родительских процессов fork(); однако мне нужно поделиться fd "после", ребенок уже был разветвлен.
Я нашел несколько веб-страниц, сообщающих мне, что sendmsg() может работать для суровых процессов; но это кажется очень зависимым от ОС и сложным. portlisten кажется лучшим примером, который я могу найти, но я бы предпочел хорошую библиотеку-обертку, такую как libevent, которая скрывает всю магию kqueue, пула,....
Кто-нибудь знает, есть ли какая-нибудь библиотека (и переносная) для этого?
Я нашел (с другого вопроса) хорошую библиотеку: libancillary. Это просто то, что мне нужно!
Лучше всего попробовать отправить файловый дескриптор поверх сокета домена Unix. Это описано в Stephens, и в нескольких местах в Интернете, но я могу выкопать код для вас, если вы спросите красиво.
В наши дни это будет довольно портативно; многие вещи, которые считаются "не переносимыми" назад, когда (например, mmap
!) являются чрезвычайно распространенными сейчас. Если вам нужно быть более портативными, чем "большинство систем в наши дни", у вас впереди много интересных вопросов, но, возможно, если вы расскажете нам больше о том, что вы делаете, и о том, на каких платформах вы работаете ( возможно, не-Unix POSIX-платформы?), мы могли бы помочь.
Существует механизм доступа на основе сокетов на основе Unix для передачи файловых дескрипторов (таких как сокеты, которые не могут быть отображены в памяти, конечно) между процессами - с использованием системного вызова sendmsg()
.
Вы можете найти больше в Stevens (как упоминал Курт Сампсон), а также в Wikipedia.
Вы можете найти гораздо более свежий вопрос с рабочим кодом в Отправка файлового дескриптора сокета Linux.