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
?
Oppure essere portatile e basta impostare 'FD_CLOEXEC' sui descrittori non necessari prima di' exec (2) '. –
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
@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