logo

Stato di uscita di un processo figlio in Linux

Questo è noto forchetta() la chiamata di sistema viene utilizzata per creare un nuovo processo che diventa figlio del processo chiamante. 
All'uscita il bambino lascia uno stato di uscita che dovrebbe essere restituito al genitore. Quindi quando il bambino finisce diventa a zombie .
Ogni volta che il bambino esce o si ferma al genitore viene inviato un SIGCHLD segnale. 
Il genitore può usare la chiamata di sistema wait() o waitpid() insieme alle macro WIFEXITED e WEXITSTATUS per conoscere lo stato del suo figlio arrestato.
(*)wait() chiamata di sistema: sospende l'esecuzione del processo chiamante finché uno dei suoi figli non termina. 
Sintassi della chiamata di sistema wait(): 

pid_t wait(int *status);


(*)La chiamata di sistema waitpid() : sospende l'esecuzione del processo chiamante finché un figlio specificato dall'argomento pid non ha cambiato stato. 
Sintassi della chiamata di sistema waitpid() : 

pid_t waitpid(pid_t pid int *status int options)


Nota: per impostazione predefinita waitpid() attende solo i figli terminati, ma questo comportamento è modificabile tramite l'argomento opzioni come WIFEXITED WEXITSTATUS ecc.
Il valore di pid può essere: 
 



  1. Meno di -1: significa attendere qualsiasi processo figlio il cui ID del gruppo di processi è uguale al valore assoluto di pid.
  2. Uguale a -1: significa attendere qualsiasi processo figlio.
  3. Uguale a 0: significa attendere qualsiasi processo figlio il cui ID di gruppo di processi sia uguale a quello del processo chiamante.
  4. Maggiore di 0: significa attendere il figlio il cui ID processo è uguale al valore di pid.


WIFEXITED e WEXITSTATUS sono due delle opzioni che possono essere utilizzate per conoscere lo stato di uscita del bambino. 
WIFEXITED(status): restituisce vero se il figlio ha terminato normalmente.
WEXITSTATUS(status): restituisce lo stato di uscita del figlio. Questa macro dovrebbe essere utilizzata solo se WIFEXITED restituisce true.
Di seguito è riportata un'implementazione C in cui il bambino utilizza esegui() funzione ma il percorso specificato per excl() non è definito. 
Vediamo qual è il valore dello stato di uscita del figlio che il genitore ottiene.

C
// C code to find the exit status of child process #include  #include  #include  #include  #include  // Driver code int main(void) {  pid_t pid = fork();    if ( pid == 0 )  {  /* The pathname of the file passed to execl()  is not defined */  execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL);  }  int status;    waitpid(pid &status 0);  if ( WIFEXITED(status) )  {  int exit_status = WEXITSTATUS(status);   printf('Exit status of the child was %dn'   exit_status);  }  return 0; } 

Produzione: 
 

Stato di uscita di un processo figlio in Linux
 

Nota: Il codice precedente potrebbe non funzionare con il compilatore online poiché fork() è disabilitato.
Qui lo stato di uscita è 127 che indica che c'è qualche problema con il percorso o c'è un errore di battitura.
Alcuni codici di stato di uscita sono elencati di seguito per ulteriori informazioni: 
 

  • 1: Errori vari come "divisione per zero" e altre operazioni non consentite.

  • 2: Problema con parola chiave, comando o autorizzazione mancante.
  • 126: problema di autorizzazione o comando non eseguibile
  • 128: argomento non valido per uscire.


Nota: lo standard C non definisce il significato dei codici di ritorno. Le regole per l'utilizzo dei codici di ritorno variano a seconda delle piattaforme.
 

Crea quiz