2010-01-04 2 views
39

In Linux, è possibile per me di aprire un socket e passare il socket a un altro processo? Se sì, puoi dirmi dove posso trovare un esempio?Posso aprire un socket e passarlo a un altro processo in Linux

Grazie.

+0

possibile duplicato del [Posso condividere un descrittore di file a un altro processo su linux o sono locali al processo?] (Http://stackoverflow.com/questions/2358684/can-i-share-a-file- descrittore-per-altro-processo-on-linux-o-sono-che-local-to-t) – Gilles

risposta

53

Sì, è possibile, utilizzando sendmsg() con SCM_RIGHTS da un processo all'altro:

SCM_RIGHTS - Inviare o ricevere un insieme di descrittori di file aperti da un altro processo . La parte dati contiene un array intero dei descrittori di file. I descrittori di file passato si comportano come se sono stati creati con dup(2).

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

Questo non è l'uso tipico però. Più comune è quando un processo eredita i socket dal suo genitore (dopo un fork()). Eventuali handle di file (inclusi socket) non chiusi saranno disponibili per il processo figlio. Quindi il processo figlio eredita i socket dei genitori.

Un processo server in ascolto per le connessioni è chiamato un demone. Questo di solito si biforca su ogni nuova connessione, generando un processo per gestire ogni nuova richiesta. Un esempio tipico del daemon è qui:

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

Scorrere nullo process().

+14

a meno che non vogliono sborsare un nuovo processo per ogni richiesta, ma basta passare la richiesta a una serie di lavoratori . – magiconair

+0

Sembra specifico per AF_UNIX. Questo può essere fatto per i socket TCP? –

+5

@AdrianRatnapala: no, non è possibile inviare una presa (o handle di file) su TCP su un'altra macchina, devono rimanere all'interno dello stesso kernel. Quindi il canale su cui si comunica deve essere AF_UNIX, ma il gestore di file che si trasferisce può ovviamente essere un socket TCP. – Zarat