c - 为什么 fork() 返回该组合中所有可能的输出?

标签 c output fork child-process

问题:

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

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

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

我的方法:

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

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

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

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

情况 2:p0 打印 01,因为可能存在 pid 是子进程的情况(它是内核主进程的子进程吗?)。然后 fork 的子节点 p1 是父节点,因此它打印 0102。最终答案是 0102

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

情况 4:p0 打印 00,因为它不是父项或子项。然后 fork 的子进程 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) ;
}

答案:0102或0012或0201或0021

最佳答案

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

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

关于c - 为什么 fork() 返回该组合中所有可能的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28644454/

相关文章:

C++,如何在进程或线程之间共享数据

c - 写入管道总是失败

c - 访问结构体中定义的函数指针?

c - 快速排序不适用于大输入

c - 打印出目标表模式中的字符

c - 我的 C 通讯录程序遇到一个小问题

format - 如果没有被告知,什么可以使简单 ada 程序的输出缩进?

c - C 中的负数除法

在输出到文件之前来自用户的 C++ 输入

c - Linux 命令菜单(例如 ls、ipconfig 等),用于 fork 并使用 execl 将命令作为子进程运行