首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fork()命令

fork()命令
EN

Stack Overflow用户
提问于 2016-06-29 15:58:58
回答 2查看 68关注 0票数 2

一个问题是,在C中运行以下代码之后,需要打印多少个A:

代码语言:javascript
复制
int i;
for (i=1;i<4;i++){
     fork();
     printf("A");
}

我自己数了14个。然而,运行它之后,asnwer就变成了24。后来我运行了一个修改过的版本:

代码语言:javascript
复制
 int i;
 for (i=1;i<4;i++){
      fork();
       printf("A\n");
 }

上面印着14A。我希望有人能给我解释一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-29 16:12:57

A数不同的原因是行缓冲。

第一个版本不会打印新行,因此在程序退出之前不会实际写出printf。

因为fork()调用重复了整个运行过程,所以它也复制了A的缓冲行。

然后,当每个进程退出时,它会刷新其缓冲区以输出。

该程序的第二个版本使用每个printf调用刷新其输出,这是因为新行,以及如果要打印到终端,大多数C实现都会刷新新行上的缓冲区。(如果打印到文件或网络套接字,它不会刷新。)

票数 6
EN

Stack Overflow用户

发布于 2016-06-29 16:14:27

这是因为printf是行缓冲的,也就是说,它的缓冲区只有在遇到新行时才会被刷新。

在第二种情况下,您已经放置了一个'\n‘,因此在每次清除缓冲区时都会发生预期的行为。

在第一个案例中,

在第一个叉子()之后:

代码语言:javascript
复制
  Buffer : A

在第二个叉子()之后:

代码语言:javascript
复制
  Buffer : AA

在第三个叉子()之后:

代码语言:javascript
复制
  Buffer : AAA ( 3 A's exist in the buffer )

因此,最后,当您总共有8个进程时,8*3= 24。因此,24A

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38104683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档