带标准IO带缓存区和非标准IO 遇到fork是的情况分析

废话不多说 直接代码

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>


int globvar = 88;
char buf[] = "a write to stdout
";

int main()
{
	int var = 10;
	pid_t pid ;
	//write 该函数是不带缓冲区的非标准函数
	if(write(STDOUT_FILENO,buf,sizeof(buf)-1) != sizeof(buf)-1);
	
	//printf 带缓存区的  标准IO函数
	printf("befor fork
");

	if( (pid = fork()) < 0 ){
	}else if(pid == 0){
		globvar++;
		var++;

	}else{
		sleep(2);
	}

	printf("pid = %ld, glob = %d, var = %d
",(long)getpid(),globvar, var);

	exit(0);

}  

第一种情况

root@instance-ug0zl538:~/learing/4-2# ./fork
a write to stdout
befor fork
pid = 92706, glob = 89, var = 11
pid = 92705, glob = 88, var = 10

第二种情况

./fork > file

a write to stdout
befor fork
pid = 92714, glob = 89, var = 11
befor fork
pid = 92713, glob = 88, var = 10

为什么会这样呢 ?是不是 有点小意外  其实啦 没什么咯  很简单

write函数是不带缓冲区的   因为在fork之前 调用write 所以其数据  写到标准输出  只有一次。

但是标准IO函数是带缓存。 如果标准IO输出连接到终端设备,则它行缓冲的,否则是全缓冲。   

 所以当已交互式(连接到终端了嘛)方式运行时 printf函数只输出一行(行缓冲然后fork时没有用 只有一行),标准输出由换行符号冲洗。但当定向到一个文件时,却得到printf的两次输出,就这个很容易理解吗 (因为全部缓冲了嘛) 又加上fork的原因嘛

还是解释下吧  因为fork 复制了 父进程的 标准IO缓冲区   所以子进程也有了这些缓冲区的数据  然后在各自调用 第二个print的时候  会将其数据  追加到 缓冲区中去且带有行缓冲符号        最后调用 exit函数  进程终止  则会刷新缓冲区域  

不理解 在看书  环境高级编程  p184   

原文地址:https://www.cnblogs.com/zhangkele/p/10645156.html