web-dev-qa-db-fra.com

comment utiliser l'attente en C

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 pids 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);    
    }
}
7

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.

11