Ich stieß auf einen Code in C, wo wir den Rückgabewert von wait
überprüfen und wenn es kein Fehler ist, gibt es noch eine Überprüfung von WIFEXITED
und WIFEXITSTATUS
. Warum ist das nicht überflüssig? So weit ich verstehe wait
gibt -1 zurück, wenn ein Fehler aufgetreten ist, während WIFEXITED
einen Wert ungleich Null zurückgibt, wenn wait
Kind normal beendet wird. Also, wenn es keinen Fehler in dieser Zeile gab if (wait(&status) < 0)
warum würde irgendetwas schief gehen during WIFEXITED
überprüfen?Warum sollten wir nach dem Warten WIFEXITED überprüfen, um unter Linux Systemaufrufe untergeordnete Prozesse zu beenden?
Dies ist der Code:
#include <stdio.h>
#include <signal.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#define CHILDREN_NUM 5
int main() {
int i, status, pid, p;
for(i = 0; ((pid = fork()) < 0) && i < CHILDREN_NUM;i++)
sleep(5);
if (pid == 0)
{
printf(" Child %d : successfully created!\n",i);
exit(0); /* Son normally exits here! */
}
p = CHILDREN_NUM;
/* The father waits for agents to return succesfully */
while (p >= 1)
{
if (wait(&status) < 0) {
perror("Error");
exit(1);
}
if (! (WIFEXITED(status) && (WEXITSTATUS(status) == 0))) /* kill all running agents */
{
fprintf(stderr,"Child failed. Killing all running children.\n");
//some code to kill children here
exit(1);
}
p--;
}
return(0);
}