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

Posted zhangkele

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带标准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\n";

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\n");

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

	}else{
		sleep(2);
	}

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

	exit(0);

}  

第一种情况

[email protected]:~/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的时候  会将其数据  追加到 缓冲区中去且带有行缓冲符号\n       最后调用 exit函数  进程终止  则会刷新缓冲区域  

 

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

 

以上是关于带标准IO带缓存区和非标准IO 遇到fork是的情况分析的主要内容,如果未能解决你的问题,请参考以下文章

Go标准库-带缓冲的IO(bufio)

标准IO与文件IO 的区别

文件IO函数和标准IO库的区别

Linux系统编程IO标准缓冲区

NIO原理解析

文件I/O与标准I/