转载地址:http://blog.csdn.net/lxmky/article/details/5457324
在*nix系统中,缓冲方式存在三种,分别是:
1,全缓冲
2,行缓冲
3,无缓冲
在学习APUE这本书时,程序8-1中,就很好的体现了全缓冲和行缓冲的区别,代码如下:
- #include<stdio.h>
- #include<unistd.h>
- int glob=6;
- char buf[]="a write ro stdout/n";
- int main()
- {
- int var;
- pid_t pid;
- printf("a write to stdout/n");
- fflush(NULL);
- if((pid=fork())<0)
- {
- printf("fork error");
- }
- else
- {
- if(pid==0)
- {
- glob++;
- var++;
- }
- else
- {
- sleep(2);
- }
- }
- printf("pid=%d,glob=%d,var=%d/n",getpid(),glob,var);
- exit(0);
- }
编译成功后,我这里生成的二进制文件默认为a.out
运行:./a.out
可以看到结果如下:
- a write to stdout
- pid=6587,glob=7,var=134514042
- pid=6586,glob=6,var=134514041
运行./a.out > temp.out
结果如下:
- a write to stdout
- pid=6591,glob=7,var=134514042
- a write to stdout
- pid=6590,glob=6,var=134514041
分析原因:
在./a.out输出中,标注输出是STDOUT_FILENO,是交互式的终端,所以系统采用的缓冲方式行缓冲,很快被新的一行冲掉,重定向后,标准输出是全缓冲。当调用fork时 a write to stdout这行仍然保存在缓冲中,并随着数据段复制到子进程缓冲中,这样,这一行就分别进入父子进程的输出缓冲中,