Портативный способ передачи файлового дескриптора между различными процессами - PullRequest
23 голосов
/ 26 мая 2009

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

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

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

Ответы [ 3 ]

17 голосов
/ 26 мая 2009

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

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

12 голосов
/ 27 мая 2009

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

11 голосов
/ 26 мая 2009

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

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

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

...