一个问题是,在C中运行以下代码之后,需要打印多少个A:
int i;
for (i=1;i<4;i++){
fork();
printf("A");
}我自己数了14个。然而,运行它之后,asnwer就变成了24。后来我运行了一个修改过的版本:
int i;
for (i=1;i<4;i++){
fork();
printf("A\n");
}上面印着14A。我希望有人能给我解释一下。
发布于 2016-06-29 16:12:57
A数不同的原因是行缓冲。
第一个版本不会打印新行,因此在程序退出之前不会实际写出printf。
因为fork()调用重复了整个运行过程,所以它也复制了A的缓冲行。
然后,当每个进程退出时,它会刷新其缓冲区以输出。
该程序的第二个版本使用每个printf调用刷新其输出,这是因为新行,以及如果要打印到终端,大多数C实现都会刷新新行上的缓冲区。(如果打印到文件或网络套接字,它不会刷新。)
发布于 2016-06-29 16:14:27
这是因为printf是行缓冲的,也就是说,它的缓冲区只有在遇到新行时才会被刷新。
在第二种情况下,您已经放置了一个'\n‘,因此在每次清除缓冲区时都会发生预期的行为。
在第一个案例中,
在第一个叉子()之后:
Buffer : A在第二个叉子()之后:
Buffer : AA在第三个叉子()之后:
Buffer : AAA ( 3 A's exist in the buffer )因此,最后,当您总共有8个进程时,8*3= 24。因此,24A
https://stackoverflow.com/questions/38104683
复制相似问题