как использовать ожидание в C

Как использовать wait ? Это просто сбивает меня с толку до бесконечности. Я fork создал дерево процессов с рекурсией, и теперь детям приходится приостанавливаться (ждать/засыпать), пока я запускаю pstree, чтобы я мог распечатать дерево процессов.

Должен ли я использовать

int status;
wait(&status);

или скорее

wait(NULL)

и куда мне это положить? в родительском if(pid > 0) или в дочернем if(pid==0)? Может быть, в конце ifs, поэтому я сохраняю все pid в массиве, а затем запускаю над ними for и использую ожидание?

мой шаблон кода:

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

person jabk    schedule 17.05.2014    source источник
comment
sleep(/*How many seconds do you want to wait*/);. sleep(1); подождите 1 секунду.   -  person    schedule 17.05.2014
comment
Вот несколько ссылок, которые помогут вам лучше понять, как работают fork() и wait(). Посмотрите на них и вернитесь к своему вопросу. Если не помогает, обратитесь за помощью csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/wait.html, stackoverflow.com/questions/6210638/ , csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html   -  person neerajDorle    schedule 17.05.2014
comment
Прочтите wait и sleep страницы руководства. Я уверен, что вы найдете разницу довольно быстро.   -  person Some programmer dude    schedule 17.05.2014
comment
Я понимаю, как работает fork. Я также различаю sleep и wait. Чего я не знаю, так это что такое int status, когда использовать status или когда NULL и где я должен waitчтобы я мог использовать pstree   -  person jabk    schedule 17.05.2014


Ответы (1)


Системный вызов wait переводит процесс в спящий режим и ожидает дочерний процесс для завершения. Затем он заполняет аргумент кодом выхода дочернего процесса (если аргумент не NULL).

Итак, если в родительском процессе у вас есть

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

И в дочернем процессе вы делаете, например. exit(1), то приведенный выше код напечатает

Child process exited with 1 status

Также обратите внимание, что важно дождаться всех дочерних процессов. Дочерние процессы, которых вы не ждете, будут находиться в так называемом состоянии зомби, пока родительский процесс все еще работает, и как только родительский процесс завершится, дочерние процессы станут осиротевшими и станут дочерними по отношению к процессу 1.

person Some programmer dude    schedule 17.05.2014
comment
@user2202368 user2202368 Тогда вас не волнует статус, вы просто ждете завершения дочернего процесса. - person Some programmer dude; 17.05.2014
comment
как вы ждете более одного ребенка? - person Cătălina Sîrbu; 07.01.2021
comment
@CătălinaSîrbu wait ждет первого потомка. - person Some programmer dude; 07.01.2021