2010-01-04 4 views
39

Sous Linux, est-il possible pour moi d'ouvrir une socket et de passer le socket à un autre processus? Si oui, pouvez-vous me dire où je peux trouver un exemple?Puis-je ouvrir un socket et le passer à un autre processus sous Linux?

Merci.

+0

duplication possible de [Puis-je partager un descripteur de fichier avec un autre processus sous Linux ou sont-ils locaux au processus?] (Http://stackoverflow.com/questions/2358684/can-i-share-a-file- descripteur-à-un-autre-processus-sur-linux-ou-sont-ils-local-à-t) – Gilles

Répondre

53

Oui vous pouvez, en utilisant sendmsg() avec SCM_RIGHTS d'un processus à l'autre:

SCM_RIGHTS - Envoyer ou recevoir un ensemble de descripteurs de fichiers ouverts par un autre processus . La partie de données contient un tableau d'entiers des descripteurs de fichier. Les descripteurs de fichier transmis se comportent comme bien qu'ils aient été créés avec dup(2).

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

Ce n'est pas l'usage typique bien. Plus commun est quand un processus hérite des sockets de son parent (après un fork()). Toutes les poignées de fichier (y compris les sockets) non fermées seront disponibles pour le processus enfant. Ainsi, le processus fils hérite des sockets du parent.

Un processus de serveur à l'écoute des connexions s'appelle un démon. Cela se généralise à chaque nouvelle connexion, générant un processus pour gérer chaque nouvelle requête. Un exemple typique du démon est ici:

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

Faites défiler jusqu'à annuler process().

+14

Sauf si vous ne voulez pas fourrer un nouveau processus pour chaque requête mais juste passer la requête à un ensemble de travailleurs . – magiconair

+0

Ceci est spécifique à AF_UNIX. Cela peut-il être fait pour les sockets TCP? –

+5

@AdrianRatnapala: non, vous ne pouvez pas envoyer un socket (ou un handle de fichier) via TCP à une autre machine, ils doivent rester dans le même noyau. Ainsi, le canal sur lequel vous communiquez doit être AF_UNIX, mais le gestionnaire de fichiers que vous transférez peut bien sûr être un socket TCP. – Zarat

Questions connexes