Fork in perl, ma ottenere stato di uscita da una chiamata di sistema nel processo figlio
Domanda
Quello che faccio io:
- Effettuare una chiamata AJAX a uno script CGI.
- Cgi forchette di script, ma i rendimenti genitore subito con un msg di risposta.
- Il bambino fa una chiamata di sistema, ma ha bisogno del codice di uscita e messaggi di errore.
pseudo-codice:
$SIG{CHLD} = ‘IGNORE’; # or waitpid($pid,0) in the parent process
$pid = fork();
if($pid == 0)
{
close STDOUT; # So that the parent sends the response to the client right away.
@errorMsgs = qx(tar up big directories over 50G…); # This can go on for a few minutes.
if($? ==0) { Send a ‘success’ email } # Is always false ($? == -1)
else { Send a ‘failure’ email }
}
elsif($pid){ sendResponse; waitpid($pid,0) if $SIG{CHLD} != 'IGNORE'; exit;}
Il mio problema:
difficoltà ad ottenere un codice di ritorno corretta ($?) Ed eventuali messaggi di errore da qx () come è impostato a -1 a causa di ($ SIG {CHLD} = 'IGNORE'). Se rimuovo $ SIG {CHLD} dichiarazione, la pagina web client non riceve un msg di risposta da parte del genitore fino a quando il bambino è mietuta.
Soluzione
stai ricevendo un -1, perché si sta impostando $SIG{CHLD}
a IGNORE
. Facendo che la capacità della qx
, si sta uccidendo per catturare il codice di uscita di tar
... morirà senza avvisare il genitore (il vostro processo figlio).
E 'abbastanza semplice per testare out:
perl -e '$SIG{CHLD} = "IGNORE"; system("ps"); print "Finished with $?\n";
Questo dà -1.
perl -e 'system("ps"); print "Finished with $?\n";
Questo dà 0.
Se si ha realmente bisogno il $SIG{CHLD} = 'IGNORE'
, poi basta $SIG{CHLD} = 'DEFAULT'
prima della chiamata qx
.
Inoltre, assicurarsi che si sta utilizzando il percorso completo di tar
(ad esempio /bin/tar
) nel caso in cui non si dispone di /bin
nel percorso, ed è non riuscire a eseguire. Tuttavia, sto supponendo che è ok dal momento che non ha detto nulla circa il vostro file tar non in fase di creazione.
Altri suggerimenti
Bene, se si ripristina $SIG{CHLD}
al undef
nella sezione bambino (vale a dire dopo $pid == 0
), essa non influenzerà il processo padre, giusto?