2009-10-29 12 views
7

Lorsque j'attends un groupe de processus exécutant spécifique qui est un processus enfant, WIFEXITED renvoie true indiquant que le processus s'est terminé? Est-ce ainsi que ça fonctionne? Il semble qu'il ya quelque chose je ne comprends pas ....Pourquoi WIFEXITED retournerait-il vrai sur le processus en cours?

if (waitpid(-pgid, &pstatus, WUNTRACED|WNOHANG) == -1) 
    perror("Wait error"); 

if (WIFEXITED(pstatus)) { 
    strncpy(buf, "Exited", buf_size); 
    return 0; 

Répondre

6

Comme vous avez spécifié WNOHANG Je pense que waitpid est de retour 0 et pstatus a la valeur qu'il avait avant si WIFEXITED ne fonctionne pas avec des données mises à jour.

si WNOHANG a été spécifié et un ou plusieurs enfants (s) spécifié par pid existent, mais pas encore changé d'état puis 0 est retourné.

+0

Ah, je l'ai à 0 reinitialize, mais maintenant je sorte de comprendre. mais je ne comprends pas très bien comment savoir si quelque chose est encore en cours ou s'il est sorti (sans bloquer). –

+0

Si l'un de vos enfants a changé de statut (est décédé) waitpid renverra un nombre positif. –

+0

Oh, je comprends maintenant ... J'ai besoin de prendre à la fois la valeur de retour et la valeur d'état pour obtenir l'état du processus. (La valeur de retour n'est pas juste pour l'erreur ou pas). Je vous remercie! –

1

waitpid Renvoie le PID enfant récupéré s'il recueille un enfant avec succès. Lorsqu'il est utilisé avec WNOHANG, il renvoie immédiatement 0 si aucun enfant n'est sorti. Ainsi, vous devez vérifier si la valeur de retour est 0 ou un pid avant d'inspecter status. Voir ici pour plus de détails:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/waitpid.html