2009-05-26 5 views
21

Sulla maggior parte dei sistemi UNIX che passa un file aperto tra processi può essere fatto facilmente per processi figlio/genitore da fork(); comunque ho bisogno di condividere una fd "dopo" il bambino era già biforcuto.Modo portatile per passare il descrittore di file tra diversi processi

Ho trovato alcuni webpages che mi dicono che sendmsg() può funzionare per i processi arbitary; ma questo sembra molto dipendente dal SO e complesso. Il portlisten sembra il miglior esempio che riesca a trovare, ma preferirei una buona libreria di wrapper come libevent che nasconde tutta la magia di kqueue, pool, ...

Qualcuno sa se c'è qualche libreria (e portatile modo) per fare questo?

+0

Cerca "Passare il descrittore di file" su [Demystifying Unix Domain Sockets] (http://www.techdeviancy.com/uds.html) – mgalgs

risposta

12

Ho trovato (da un'altra domanda) una buona libreria: libancillary. Questo è semplicemente ciò di cui ho bisogno!

+1

Questa non è una risposta. – LtWorf

13

La soluzione migliore è provare a inviare il descrittore di file su un socket di dominio Unix. Questo è descritto in Stephens, e in alcuni punti del web, ma posso recuperare il codice per te se lo chiedi gentilmente.

Questo sarà abbastanza portatile in questi giorni; molte cose considerate "non portabili" quando (come mmap!) sono estremamente comuni ora. Se hai bisogno di essere più portatile della "maggior parte dei sistemi al giorno d'oggi", hai davanti a te un sacco di problemi interessanti, ma forse se ci dici di più su cosa stai facendo e su quali piattaforme stai lavorando (forse piattaforme POSIX non Unix?) potremmo essere in grado di dare una mano.

+0

Ho ancora una domanda sull'uso di sendmsg(). Ho pensato che mettere il dominio socket come primo parametro sia sufficiente, ma sembra che debba ancora riempire msghdr.msg_name come sockaddr_un del socket del dominio - perché? comunque per impedirlo? – Francis

10

C'è un meccanismo basato su socket di dominio Unix per il trasferimento di descrittori di file (come socket - che non possono essere mappati in memoria, ovviamente) tra processi - utilizzando la chiamata di sistema sendmsg().

È possibile trovare ulteriori informazioni in Stevens (come citato da Curt Sampson) e anche su Wikipedia.

È possibile trovare una domanda molto più recente con codice di lavoro su Sending file descriptor by Linux socket.