C

时间:2017-09-21 03:19:36

标签: c linux fork

所以我在Fork()上继续遇到一些问题,并在名为geeksforgeeks的网站上找到了一些示例代码。以下代码段:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

void forkexample() 
{
    int x = 1;

    if (fork() == 0)
        printf("Child has x = %d\n", ++x);
    else
        printf("Parent has x = %d\n", --x);
}
int main()
{
    forkexample();
    return 0;
}

现在我可以看到为什么解决方案可以是 Child有x = 2 Parent有x = 0 但是我在尝试可视化树时遇到了一些问题。我可视化的一个大问题是第一个 if 语句是针对子进程的,那么树看起来如何?以下是我对该程序可视化的看法。

image

或者,0级上的主节点是否为子节点,因为 if 语句首先出现的顺序(这是可能的,但 else 语句可能会出现首先,它同时运行。)

有任何帮助吗?这种可视化是正确的还是我缺少的东西?

非常感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

不,您的可视化错误。

在fork之后你有两个进程:Parent和Child。 (PERIOD)

单亲可能会产生多个孩子,每个孩子都可能产生自己的孩子。但是在一个单一的叉子之后,&#34;树&#34;是两个&#34;节点&#34;。

不确定您是否尝试绘制图表:

  • 随着时间的推移进行处理,然后是,你是对的,一个进程已经变成了两个。
  • 处理关系,然后是NO,你应该只有一个父母,一个孩子。
  • 执行路径,我猜...在某些时候调用fork(),接下来你知道,你有两个进程执行if()语句。

答案 1 :(得分:0)

我不知道问题出在哪里..

架构很好,就像这样。 Fork()通过复制调用进程来创建新进程。成功时,子进程的PID在父进程中返回,并在子进程中返回0。失败时,在父项中返回-1,不创建子进程(谷歌)。您必须检查返回值,以确保您处于独立运行的子进程中。

试试这个:

#include <unistd.h>

int main() 
{
  pid_t p;
  int   x;

  x = 1;
  p = fork();
  printf("pid = %d\n", p);
  if (p == 0) {
    printf("Child has x = %d and pid = %d\n", ++x, p);
    sleep(1);
  } else {
    printf("Parent has x = %d and pid = %d\n", --x, p);
    sleep(1);
  }
}

它们是在同一时间执行的,因为它们是独立的,但父母在输出中是主要的

尼古拉斯