问题:
我需要关于我对 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/