stdout缓冲区的疑问

softirq_2 2011-11-29 11:05:37

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int glob = 6;
int main(int argc,char** argv)
{
int fd;
int iRet;
int var;
pid_t pid;
var = 88;
var++;
/*setbuf(stdout, NULL);*/
printf("pid:%d before fork()\n", getpid());
if ((pid = fork()) == 0)
{
glob++;
var++;
}
else if(pid < 0)
{
glob++;
var++;
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
return 0;
}


编译之后 直接执行./a.out 会在屏幕上打印出三行
pid:22298 before fork()
pid = 22299, glob = 7, var = 90
pid = 22298, glob = 6, var = 89
但是如果./a.out>kk
cat kk之后
发现kk里面有4行
其中有两行 before fork()
pid:22332 before fork()
pid = 22333, glob = 7, var = 90
pid:22332 before fork()
pid = 22332, glob = 6, var = 89


--------------------------------
感觉有点怪怪的 可能是stdout缓冲区的原因把
我加上setbuf(stdout, NULL)这条语句就好了
但是不知道原因
请高手解释一下
...全文
125 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinzhou520 2011-11-29
  • 打赏
  • 举报
回复

有这么奇怪的事,看看.
qq120848369 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justkk 的回复:]
对,你定向到文件以后,标准输出的缓冲方式变成全缓冲的,也就是说满足一定的大小后才输出
fork()的时候,子进程同时继承了这个还没有刷新的缓冲区
[/Quote]

++

缓冲区是应用层的,fork时候产生一样的副本, 父子进程退出时冲刷缓冲区导致这个结果.
justkk 2011-11-29
  • 打赏
  • 举报
回复
标准输出缺省是行缓冲的,遇到\n就输出

你也可以强制输出,在printf之后,fork()之前,添加
fflush(stdout);
dongjiawei316 2011-11-29
  • 打赏
  • 举报
回复
应该就是缓冲区的原因了,创建子进程时,父进程的缓冲区也被复制到子进程了。所以子进程在printf时,就一起printf出来了。
justkk 2011-11-29
  • 打赏
  • 举报
回复
对,你定向到文件以后,标准输出的缓冲方式变成全缓冲的,也就是说满足一定的大小后才输出
fork()的时候,子进程同时继承了这个还没有刷新的缓冲区
softirq_2 2011-11-29
  • 打赏
  • 举报
回复
为什么定向到文件以后 标准输出的缓冲方式变成全缓冲的?

[Quote=引用 1 楼 justkk 的回复:]

对,你定向到文件以后,标准输出的缓冲方式变成全缓冲的,也就是说满足一定的大小后才输出
fork()的时候,子进程同时继承了这个还没有刷新的缓冲区
[/Quote]

23,117

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧