Fork in perl, ma ottenere stato di uscita da una chiamata di sistema nel processo figlio

StackOverflow https://stackoverflow.com/questions/5813312

  •  25-10-2019
  •  | 
  •  

Domanda

Quello che faccio io:

  1. Effettuare una chiamata AJAX a uno script CGI.
  2. Cgi forchette di script, ma i rendimenti genitore subito con un msg di risposta.
  3. 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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top