2009-05-26 4 views
21

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

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

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

+0

Поиск «Передача дескриптора файла» на [Демистификация доменов Unix домена] (http://www.techdeviancy.com/uds.html) – mgalgs

ответ

12

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

+1

Это не ответ. – LtWorf

13

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

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

+0

У меня все еще есть вопрос в использовании sendmsg(). Я думал, что поставить доменный сокет в качестве первого параметра достаточно, но похоже, что мне еще нужно заполнить msghdr.msg_name как sockaddr_un сокета домена - почему? во всяком случае, чтобы предотвратить это? – Francis

10

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

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

Вы можете найти более свежий вопрос с рабочим кодом на Sending file descriptor by Linux socket.

Смежные вопросы