2010-07-05 8 views
5

ho la situazione seguente (pseudocodice):Prevent fork() dalle prese la copia

function f: 
    pid = fork() 
    if pid == 0: 
     exec to another long-running executable (no communication needed to that process) 
    else: 
     return "something" 

f è esposto su un server XmlRpc++. Quando la funzione viene chiamata su XML-RPC, il processo padre stampa "done closing socket" dopo che la funzione ha restituito "qualcosa". Ma il client XML-RPC si blocca fintanto che il processo figlio è ancora in esecuzione. Quando uccido il processo figlio, il client XML-RPC termina correttamente la chiamata RPC.

Mi sembra che stia avendo un problema con fork() copiando i descrittori di socket nel processo figlio (genitore chiamato closesocket ma il figlio possiede ancora un riferimento -> connessione ancora stabilita). Come posso eludere questo?

EDIT: ho letto su FD_CLOEXEC già, ma non può io forza tutti i descrittori da chiudere su exec?

risposta

5

No, non è possibile forzare la chiusura di tutti i descrittori di file su exec. Sarà necessario eseguire il ciclo su tutti i descrittori di file indesiderati nel bambino dopo lo fork() e chiuderli. Sfortunatamente, non esiste un modo facile e portabile per farlo: il metodo usuale è usare getrlimit() per ottenere il valore corrente di RLIMIT_NOFILE e passare da 3 a quel numero, provando close() per ciascun candidato.

Se si è felici di essere solo Linux, è possibile leggere la directory /proc/self/fd/ per determinare i descrittori di file aperti e chiuderli (eccetto 0, 1 e 2 - che dovrebbero essere lasciati da soli o riaperti a /dev/null).

+2

Oppure essere portatile e basta impostare 'FD_CLOEXEC' sui descrittori non necessari prima di' exec (2) '. –

+0

Ora l'ho implementato con il filesystem proc, tornando alla soluzione 'getrlimit' se necessario (se/proc/self/fd non esiste). Solo una domanda: c'è una differenza tra 'getrlimit (RLIMIT_NOFILE, ...) - 1' e' sysconf (_SC_OPEN_MAX) '? – AndiDog

+0

@Nikolai: Certo, che o semplicemente 'close()' loro - ma che presume che tu * sappia * quali descrittori di file sono aperti, e dal contesto sembra che non sia il caso (dal momento che sono aperti da terzi -party software). – caf