为什么 fork() 在这个组合中返回所有可能的输出?

gef*_*rce 2 c fork child-process output

题:

我需要澄清/帮助我对 fork() 输出的理解。我知道如何使用 fork() 在 c 中编写更详细和更大的代码,并使用其他概念,如管道、ipc、线程(posix)。但是我对预测返回输出的理解很糟糕,这就是为什么我试图弄清楚这一点我相信我的案例 1 是正确的,但我的其他案例不明确或与此相似,因为我对 fork() 的输出不太了解.

我对程序输出的了解不错,我了解包含 for 循环、while 循环、if/else、数据结构、递归输出的基本算法。

但是,我缺乏关于使用 fork() 的程序如何准确输出以及父/子进程组合如何完全如下所述的知识

我的方法:

最初我们有一个运行 p0 的父进程,然后 pid 派生一个子进程。

因此,所有可能的输出将始终包含 0,因为最初 num=0 并且在第一个 prinf() 语句之前 num 未设置为任何其他数字。

我相信父进程和子进程执行的时间是随机的,因为它可以以任何顺序出现。

情况 1:p0 打印 02,因为可能存在 pid 是父项的情况。然后分叉的子进程 p1 打印 01。最终答案将是 0201

情况 2: p0 打印 01 因为可能存在 pid 是子进程的情况(它是内核主进程的子进程吗?)。然后分叉的孩子 p1 是父母,所以它打印 0102。最终答案是 0102

情况 3: p0 打印 00,因为 pid 不是孩子或父母。然后分叉的孩子 p1 打印 12 因为它同时是孩子和父母。最终答案是 0012。

情况 4: p0 打印 00,因为它不是父级或子级。然后分叉的子进程 p1 打印 21 因为它可以同时是父进程和子进程。最终答案是 0021。

代码:

#include <stdio.h>
int num = 0 ;
int main(int argc, char *argv[])
{
  int pid ;
  pid = fork() ;

  printf("%d",num) ;

  if (pid == 0) {
    num = 1;
  } else if (pid > 0) {
    num = 2 ;
  }
  printf("%d",num) ;
}
Run Code Online (Sandbox Code Playgroud)

答案:0102 或 0012 或 0201 或 0021

Ste*_*ppo 5

我猜你把它复杂化了。在 a 之后发生的事情fork()是您有两个实例(父子)在执行,每个实例执行两个输出操作。

这两个实例是独立的,彼此一无所知,所以一个不会等待另一个完成,你就有了所谓的竞争条件。唯一的保证是每个进程将首先输出0,然后1(或2),因为这是每个进程中的操作顺序。但是你不能说这四个输出操作将如何交错。