2010-03-29 9 views
0

Après avoir créé un processus fils et l'avoir quitté immédiatement (_exit()), je souhaite effectuer une attente et vérifier l'état. Maintenant je me demande si dans la branche 'else' de la construction if/else je dois aussi vérifier WIFSIGNALED. Pour autant que je comprenne, si j'effectue une attente, a) une erreur aurait pu se produire (-1), l'enfant aurait pu se terminer normalement par un (exit() ou _exit()), ou il aurait pu être terminé par un signal, de sorte que le contrôle pourrait être omis, non?Vérification de l'état après wait()

//remainder omitted 

int status; 

pid_t t_pid = wait(&status); 

if (t_pid == -1) { 
    perror("wait"); 
    exit(EXIT_FAILURE); 
} 

if (WIFEXITED(status)) { 
    printf("child terminated normally, status = %d\n", 
      WEXITSTATUS(status) 
    ); 
} else { // <-- do it have to check for WIFSIGNALED() here? 
    printf("child was terminated by a signal, signum = %d\n", 
      WTERMSIG(status) 
    ); 
} 

Répondre

1

Oui, vous avez raison - si wait a réussi alors WIFEXITED() ou WIFSIGNALED() sera vrai.

1

Oui. POSIX.1 états:

Si l'information pointée par stat_loc a été stocké par un appel à waitpid() qui ne précise pas le WUNTRACED ou drapeaux WCONTINUED, ou par une fonction appel à l'attente() , exactement l'une des macros WIFEXITED (* stat_loc) et WIFSIGNALED (* stat_loc) doit évaluer à une valeur non nulle.

En utilisant waitpid() avec WUNTRACED ou WCONTINUED, il est possible d'obtenir un statut où WIFSTOPPED (* stat_loc) ou WIFCONTINUED (* stat_loc) est vrai à la place.

+0

+1 Très belle explication, merci – helpermethod