поведение функции wait () - PullRequest
1 голос
/ 16 октября 2011

У меня есть следующий код:

#include <stdio.h>
main(int argc, char *argv[])
{
    int n,st;
    n = atoi(argv[1]);
    while(n*fork()) {
        printf("%d %d\n",getpid(), getppid());
        n--;
        printf("%d\n", wait(&st));
        printf("------\n");
    }
}

Я выполняю этот код и получаю следующие результаты:

bash-3.2$ ./test 3
10218 9948
10219
------
10218 9948
10220
------
10218 9948
10221
------

вот мои мысли: Родитель создает ребенка:

10218 9948

Но после этого я не понимаю, почему printf("%d\n", wait(&st)); возвращает этот идентификатор: 10219 .

wait() должен возвращать идентификатор ребенка, который завершается.

Кто-нибудь может помочь?!

Ответы [ 3 ]

5 голосов
/ 16 октября 2011

Ожидание не блокирует, потому что нет причин для блокировки.Ребенок уже закончил казнь.Это связано с тем, что Linux запланирует запуск «дочернего» процесса первым.

Вот что происходит в графической форме:

bash(9948)
|
|       main(10218)       child1(10219)       child2(10220)      child3(10221)
>-------------->
               |
             fork--------------->
                                |
                            while(0);
                            terminate;
                                |
             print 10218 9948---<
             wait (no block)
             print 10219
              |
             fork----------------------------------->
                                                    |
                                                while(0);
                                                terminate;
                                                    |
             print 10218 9948-----------------------<
             wait (no block)
             print 10220
              |
             fork----------------------------------------------------->
                                                                      |
                                                                  while(0);
                                                                  terminate;
                                                                      |
             print 10218 9948-----------------------------------------<
             wait (no block)
             print 10221
             terminate
               |
---------------<
0 голосов
/ 16 октября 2011

Это нормально.

Если вас интересует PID процессов, созданных fork (), вы должны вывести возвращаемое значение.

getpid всегда будет возвращать PID основногопроцесс, и getppid его родителя (оболочка).Поскольку они не меняются, нет смысла печатать их в цикле.

0 голосов
/ 16 октября 2011

fork возвращает ноль для дочернего процесса, поэтому только исходный процесс входит в цикл while; дети выходят, ничего не печатая.

Каждый раз, когда родитель печатает свой идентификатор процесса и идентификатор своего родительского процесса, а затем печатает идентификатор дочернего процесса в качестве возвращаемого значения wait.

В вашем примере исходный процесс имеет pid = 10218 и разветвляет детей с идентификаторами процессов 10219, 10220, 10221 и т. Д.

...