系统相关
首页 > 系统相关> > 从fork()创建的两个进程中调用时,wait(0)都不会做任何事情吗?

从fork()创建的两个进程中调用时,wait(0)都不会做任何事情吗?

作者:互联网

我试图了解fork的工作原理,并且我知道当您调用fork()时,将创建另一个进程,该进程从与堆和堆栈复制到的完全相同的行中恢复.对于父级,fork()返回子级的PID,对于子级,它返回0.

我偶然发现了这个问题:“以下序列会创建多少个进程?”

fork();fork();wait(0);fork();wait(0);

答案是8,包括父母在内,但我不清楚wait(0)是否真正在等待.我发现这与“ wait”手册有关:

If there are at least one child processes running when the call to wait() is made, the caller will be blocked until one of its child processes exits. At that moment, the caller resumes its execution.
If there is no child process running when the call to wait() is made, then this wait() has no effect at all. That is, it is as if no wait() is there.

我对此的理解如下:

enter image description here

最左边的分支是父节点,黑色的圆圈是创建分支的位置.这使我相信wait(0)不会执行任何操作,因为没有等待的孩子,因此它被忽略了.但是,我对代码进行了一些修改,为每个过程添加了一个“索引”.

#include <stdio.h>
int main()
{

    int index = 0;
    if (fork()==0)
    index++;
    if (fork()==0)
    index++;
    wait(0);
    if (fork()==0)
    index++;
    wait(0); 
    printf("%d\n",index);
}

并打印出21312021

注释完wait(0)后,代码为:

#include <stdio.h>
int main()
{

    int index = 0;
    if (fork()==0)
    index++;
    if (fork()==0)
    index++;
    if (fork()==0)
    index++;
    printf("%d\n",index);
}

它打印出0112223,因此明显不同.为什么结果不同?

解决方法:

我看不到您的图像,但这是一个应准确反映该程序运行时行为的图像.添加显式的exit(0)调用有助于理解:

fork() ----------------------------,
  |                                |
fork() -----,                    fork() -------,
  |         |                      |           |
  |       wait(0)                  |         wait(0)
  |         |                      |           |
  |       fork()------,            |         fork() ------, 
  |         |         |            |           |          |
  |         |       wait(0)        |           |        wait(0)
  |         |         |            |           |          |
  |         |       exit(0)        |           |        exit(0)
  |         |         |            |           |          | 
  |       wait(0) <---´            |         wait(0) <----´
  |         |                      |           |
  |       exit(0)                  |         exit(0)
  |         |                      |           |
  |         |                    wait(0) <-----´
  |         |                      |
  |         |                    fork() -------,
  |         |                      |           |
  |         |                      |         wait(0)
  |         |                      |           |
  |         |                      |         exit(0)
  |         |                      |           |
  |         |                    wait(0) <-----´
  |         |                      |
  |         |                    exit(0)
  |         |                      |
wait(0) <---+----------------------´
  |
fork()------,
  |         |
  |       wait(0)
  |         |
  |       exit(0)
  |         |
wait(0) <---´
  |
exit(0)

在这里,每个子进程都位于父进程的右侧.每个wait(0)将等待从上述fork()中出现的那些行.

不能完全显示一件事:第一个wait()处的第一个进程正在运行两个子进程的位置,因此它将等待第一个完成的进程.我图片中的或被理解为“或”(或者我想不出一种更好的图形显示方式).

标签:systems-programming,wait,c-3,linux,fork
来源: https://codeday.me/bug/20191111/2018749.html