2010-01-04 7 views
39

En Linux, ¿me es posible abrir un socket y pasar el socket a otro proceso? En caso afirmativo, ¿puede decirme dónde puedo encontrar un ejemplo?¿Puedo abrir un socket y pasarlo a otro proceso en Linux

Gracias.

+0

posible duplicado de [¿Puedo compartir un descriptor de archivo en otro proceso en Linux o son locales para el proceso?] (Http://stackoverflow.com/questions/2358684/can-i-share-a-file- descriptor-to-another-process-on-linux-or-are-they-local-to-t) – Gilles

Respuesta

53

Sí se puede, usando sendmsg() con SCM_RIGHTS de un proceso a otro:

SCM_RIGHTS - Enviar o recibir un conjunto de descriptores de archivos abiertos de otro proceso . La porción de datos contiene una matriz de enteros de los descriptores de archivos. Los descriptores de archivos pasados ​​se comportan como aunque se han creado con dup(2).

http://linux.die.net/man/7/unix

Ese no es el uso típico sin embargo. Más común es cuando un proceso hereda los sockets de su padre (después de fork()). Todos los identificadores de archivo (incluidos los sockets) no cerrados estarán disponibles para el proceso secundario. Entonces, el proceso secundario hereda los sockets de los padres.

Un proceso de servidor que escucha las conexiones se llama daemon. Esto usualmente se bifurca en cada conexión nueva, generando un proceso para manejar cada nueva solicitud. Un ejemplo del demonio es típico aquí:

http://www.steve.org.uk/Reference/Unix/faq_8.html#SEC88

de desplazamiento hacia abajo para anular process().

+14

A menos que no desee bifurcar un nuevo proceso para cada solicitud, simplemente pase la solicitud a un conjunto de trabajadores . – magiconair

+0

Esto parece específico para AF_UNIX. ¿Se puede hacer esto para los sockets TCP? –

+5

@AdrianRatnapala: no, no puede enviar un socket (o identificador de archivo) sobre TCP a otra máquina, deben permanecer dentro del mismo kernel. Entonces, el canal sobre el cual se comunica debe ser AF_UNIX, pero el manejador de archivo que transfiere puede ser, por supuesto, un socket TCP. – Zarat

Cuestiones relacionadas