ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-11-11 09:51:40  阅读:347  来源: 互联网

标签:systems-programming wait c-3 linux fork


我试图了解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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有