Process 理解Fork逻辑的困难
有人能帮我理解这段代码中发生了什么吗?我很难理解为什么输出是这样的。输出为: 01 2 3 4 三, 二, 一, 0Process 理解Fork逻辑的困难,process,fork,system-calls,Process,Fork,System Calls,有人能帮我理解这段代码中发生了什么吗?我很难理解为什么输出是这样的。输出为: 01 2 3 4 三, 二, 一, 0 intmain(){ int i; 对于(i=0;i
intmain(){
int i;
对于(i=0;i<5&&!fork();i++){
fflush(stdout);
printf(“%d”,i);
}
等待(空);
printf(“\n”);
返回0;
}
这里有两件事:
首先,fork()
返回子进程中的0
,同时将非零pid返回给父进程
第二,短路&&
因此,在第一个过程(p0)的开始,它运行到i<5&!fork()
。现在i=0
创建了另一个进程(p1)。现在,对于p0,测试!fork()
失败,它结束for循环并等待子循环结束。对于p1,测试成功,并打印出0
,然后将i
增加到1,然后它将创建进程p2,并像p0一样退出For循环
由于短路,当
i
等于5时,将不再调用fork
哦,您刚刚遇到了“一个程序员‘太聪明了一半’”,fork()
系统调用基本上创建了创建它的任何进程的副本。原始进程从fork()
获取非零(因此为“true”)返回代码。这孩子得零分。不幸的是,“编写此代码的原始程序员”从未试图明确他/她的意图。你能给我解释一下fflush(stdout)调用是如何工作的吗?在我看来,数字是双重打印的,因为在缓冲区上调用flush,然后进行打印?在我的理解中,flush刷新流缓冲区,这意味着如果有什么东西,它将被刷新。如果它是空的,你什么也得不到。打印时,它首先进入缓冲区。但是如果调用fflush,结果将更快地显示,而不是在流关闭或已满时等待刷新。
int main() {
int i;
for (i = 0; i < 5 && !fork(); i++) {
fflush(stdout);
printf("%d ", i);
}
wait(NULL);
printf("\n");
return 0;
}