linux下缓冲知识:
linux下的缓冲主要分为3种,无缓冲,行缓冲和全缓冲。
一般行缓冲主要出现在shell之类的交互窗口,而全缓冲出现在重定向之类的地方。
如下:(摘自unix环境高级编程)
#include"apue.h"
int glob=6;
char buf[]="a write to stdout\n";
int main()
{
int var;
pid_t pid;
var=88;
if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1) err_sys("write error");
printf("before fork");
if((pid=fork())<0) err_sys("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 write to stdout
before fork
pid=430,glob=7,var=89
pid=429,glob=6,var=88
./a.out>test
cat test显示
a write to stdout
before fork
pid=430,glob=7,var=89
before fork
pid=430,glob=6,var=88
从./a.out和./a.out>test中可以看出区别。
首先FORK函数,创建子进程,复制父进程的栈,堆和数据空间,并共享正文段。
由于write是无缓冲函数,所以父进程输出后,再调用子进程后,子进程没有调用write函数.
接着看printf before fork,这个函数在调用子进程前,但是在重定向和直接输出中的显示结果又偏差,造成这个的原因是,printf后创建子进程,之后子进程由于共享STDIN(共享输入缓冲),所以before fork这个缓冲还存在于缓冲区中,但是由于行缓冲是靠换行符冲洗,所以在SHELL中,子进程的before fork没有显示出来,但是在重定向后,由于子进程的退出(进程的退出常伴随着缓冲的清洗),所以在pid=430,glob=7和var=89后面输出了before fork.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29454248/viewspace-1074715/
,如需转载,请注明出处,否则将追究法律责任。