【发布时间】:2013-09-11 08:46:25
【问题描述】:
请看下面的代码。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
fork();
printf(".");
fflush(stdout);
fork();
printf(",");
return 0;
}
输出是:
..,,,,
这对我来说没问题,
但如果我从上述程序中删除fflush(stdout),那么输出应该是(根据我的理解)。
...,.,.,.,
fork() 的语句是:紧跟在fork() 之后的语句被复制到父子节点。
我的理解是:
在第一个fork() 之后,我们有两个进程(假设它是进程 p 和进程 c)
进程 p 和 c 中的代码是:
printf(".");
fork();
printf(",");
现在,假设执行了进程 p 和 c 的第一条语句,那么输出将是。
..
现在fork() 语句开始执行。
所以,在执行fork()之后,我们的进程就像p,pc,c,cc。
p 、 pc 、 c 和 cc 中的代码是
printf(",");
我们不会刷新stdout,所以printf(".") 仍然存在于每个缓冲区中。
所以每个进程都会打印.,
所以输出是
.,.,.,.,
我的问题是:
1)以前的..在哪里?
即根据我的解释,输出应该是
...,.,.,.,
【问题讨论】:
-
所以您希望
.已经被打印,但同时还在缓冲区中?还是我误解了你的期望? -
你应该总是保持fork(2)的
pid_tresult并且你应该处理三种情况:失败(结果为-1) ,父母成功(结果是孩子的积极pid),孩子成功(结果为0)。 -
阅读像 Advanced Linux Programming 这样的好书 - 其中有一整章关于流程 - 以及 fork system call 上的维基页面
-
@hvd :是的,
.应该打印在终端上,并且由于我不刷新stdout,它应该仍然在缓冲区中(根据我的理解)。 -
在没有任何锁定或同步的情况下,四个进程之间的输出顺序并不是完全确定的。虽然调度程序通常会公平竞争,但您几乎无法控制它的作用以及可能影响它的其他系统事件。例如,以不同优先级运行的其他进程。假设这些不同分叉进程的输出顺序是不明智的。