问一个关于缓冲的问题。简单的fork()程序
- main(void)
- {
- int i;
- printf("%d,%d\n",getpid(),getppid());
- for(i=0;i<3;i++)
- {
- if(fork()==0)
- printf("%d,%d\n",getpid(),getppid());
- }
- }
复制代码
以上一段简单代码,直接在shell下运行和输出转向后结果差距很大,转向文件后的输出包含了很多重复的,为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
fork系统调用 从它结束起的下一条指令 父子进程就都执行了.你循环了3次.子进程也要再fork的.
至于楼主 所说的重新定向到文件里 和在标准输出看到的结果十分不同.
应当这样理解.
如果标准输出连到终端设备,它是行缓冲的.否则就是全缓冲.交互方式的时候printf只输出一次.因为有\n刷新标准输出.
重定向到文件,在fork调用之前printf.当fork时数据仍在缓冲区里.然后父进程复制到子进程中.缓冲区也被复制了.父子进程有各自的带该行内容的缓冲.依次类推.
不错,确实是因为缓冲的问题。在 for 结束的地方加一个 fflush(NULL); 就得到相同结果了。
如果没记错,终端应该是行缓冲,而文件是所谓全缓冲模式的。