2009-05-26 9 views
21

En la mayoría de los sistemas UNIX, pasar un archivo abierto entre procesos se puede hacer fácilmente para los procesos hijo/padre mediante fork(); sin embargo, necesito compartir un fd "después" de que el niño ya estaba bifurcado.Manera portátil de pasar el descriptor de archivo entre diferentes procesos

He encontrado algunos webpages diciéndome que sendmsg() puede funcionar para procesos arbitrarios; pero eso parece muy dependiente del sistema operativo y complejo. El portlisten parece ser el mejor ejemplo que puedo encontrar, pero preferiría una buena biblioteca de contenedor como libevent que oculte toda la magia de kqueue, pool, ...

¿Alguien sabe si hay alguna biblioteca (y portátil? forma) de hacer esto?

+0

Buscar "Paso de descriptor de archivo" en [Desmitificar sockets de dominio Unix] (http://www.techdeviancy.com/uds.html) – mgalgs

Respuesta

12

He encontrado (de otra pregunta) una buena biblioteca: libancillary. Esto es simplemente lo que necesito!

+1

Esa no es una respuesta. – LtWorf

13

Su mejor opción es intentar enviar el descriptor de archivo a través de un socket de dominio Unix. Esto se describe en Stephens, y en algunos lugares en la web, pero puedo desenterrar el código para usted si lo solicita amablemente.

Esto será bastante portátil en estos días; muchas de las cosas que se consideran "no portátiles" en el pasado (como mmap) son extremadamente comunes ahora. Si necesita ser más portátil que "la mayoría de los sistemas en estos días", tiene muchos problemas interesantes por delante, pero posiblemente si nos dice más sobre lo que está haciendo y las plataformas en las que está trabajando (quizás plataformas POSIX que no sean Unix?) podríamos ayudar.

+0

Aún tengo una pregunta sobre el uso de sendmsg(). Pensé que poner socket de dominio como el primer parámetro es suficiente, pero parece que todavía tengo que rellenar el nombre msghdr.msg_name como sockaddr_un del socket del dominio, ¿por qué? de todos modos para evitarlo? – Francis

10

Hay un mecanismo basado en un socket de dominio Unix para transferir descriptores de archivos (como sockets, que no se pueden mapear en la memoria, por supuesto) entre procesos, utilizando la llamada al sistema sendmsg().

Puede encontrar más en Stevens (mencionado por Curt Sampson), y también en Wikipedia.

Puede encontrar una pregunta mucho más reciente con código de trabajo en Sending file descriptor by Linux socket.

Cuestiones relacionadas