问一个关于缓冲的问题。简单的fork()程序

发布于 2022-09-30 08:08:28 字数 528 浏览 12 评论 0

  1. main(void)
  2. {
  3.   int i;
  4.   printf("%d,%d\n",getpid(),getppid());
  5.   for(i=0;i<3;i++)
  6.   {
  7.      if(fork()==0)
  8.        printf("%d,%d\n",getpid(),getppid());
  9.   }
  10. }

复制代码

以上一段简单代码,直接在shell下运行和输出转向后结果差距很大,转向文件后的输出包含了很多重复的,为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我很坚强 2022-10-07 08:08:28

fork系统调用 从它结束起的下一条指令 父子进程就都执行了.你循环了3次.子进程也要再fork的.

亢潮 2022-10-07 08:08:28

至于楼主 所说的重新定向到文件里 和在标准输出看到的结果十分不同.
应当这样理解.
如果标准输出连到终端设备,它是行缓冲的.否则就是全缓冲.交互方式的时候printf只输出一次.因为有\n刷新标准输出.
重定向到文件,在fork调用之前printf.当fork时数据仍在缓冲区里.然后父进程复制到子进程中.缓冲区也被复制了.父子进程有各自的带该行内容的缓冲.依次类推.

蓝天白云 2022-10-07 08:08:28

不错,确实是因为缓冲的问题。在 for 结束的地方加一个 fflush(NULL); 就得到相同结果了。
如果没记错,终端应该是行缓冲,而文件是所谓全缓冲模式的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文