Comment utiliser wait
? Cela me déconcerte sans fin. Je fork
un arbre de procs avec récursivité et maintenant les enfants doivent faire une pause (attendre/dormir) pendant que je lance pstree pour pouvoir imprimer l'arbre de proc.
Dois-je utiliser
int status;
wait(&status);
ou plutôt
wait(NULL)
et où dois-je mettre cela? dans le parent if(pid > 0)
ou dans les enfants if(pid==0)
? Peut-être à la fin des ifs, donc je stocke tous les pid
s dans le tableau, puis je lance un for
dessus et j'utilise wait?
mon modèle de code:
void ProcRec(int index)
{
pid_t pid;
int noChild = getNChild(index);
int i= 0;
for(i = 0; i < noChild; i++)
{
pid = fork();
if (pid > 0)
{
/* parent process */
}
else if (pid == 0)
{
/* child process. */
createProc(index+1);
}
else
{
/* error */
exit(EXIT_FAILURE);
}
}
if(getpid() == root)
{
sleep(1);
pid = fork();
if(pid == 0)
execl("/usr/bin/pstree", "pstree", getppid(), 0);
}
}
L'appel système wait
met le processus en veille et attend la fin d'un processus enfant. Il remplit ensuite l'argument avec le code de sortie du processus enfant (si l'argument n'est pas NULL
).
Donc, si dans le processus parent, vous avez
int status;
if (wait(&status) >= 0)
{
if (WEXITED(status))
{
/* Child process exited normally, through `return` or `exit` */
printf("Child process exited with %d status\n", WEXITSTATUS(status));
}
}
Et dans le processus enfant, vous faites par exemple exit(1)
, le code ci-dessus s'imprime
Processus enfant terminé avec 1 état
Notez également qu'il est important d'attendre tous les processus enfants. Les processus enfants que vous n'attendez pas seront dans un état dit zombie pendant que le processus parent est toujours en cours d'exécution, et une fois le processus parent terminé, les processus enfants seront orphelins et rendus enfants du processus 1.