wait()函数行为

时间:2011-10-16 15:45:29

标签: c wait

我有以下代码:

#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));会返回此ID: 10219

wait()应该返回终止的子代码。

有人可以帮忙吗?!

3 个答案:

答案 0 :(得分:5)

等待没有阻止,因为没有理由阻止。孩子已经完成了执行。这是因为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
               |
---------------<

答案 1 :(得分:0)

fork为子进程返回零,因此只有原始进程进入while循环;孩子们没有打印任何东西就退出了。

每次父进程打印其进程ID及其父进程id,然后打印子进程id作为wait的返回值。

在您的示例中,原始进程具有pid = 10218,并且它为处理ID为10219,10220,10221等的子女提供支持。

答案 2 :(得分:0)

这完全可以。

如果您对fork()创建的进程的PID感兴趣,则应该打印返回的值。

getpid将始终返回主进程的PID,并getppid其父进程(shell)。由于它们没有改变,因此无需在循环中打印它们。