ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 一天一篇(3)

一天一篇(3)

原创 Linux操作系统 作者:huixshh 时间:2014-01-23 21:22:30 0 删除 编辑
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博客 ” ,链接:http://blog.itpub.net/29454248/viewspace-1074715/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 一天一篇(2)
下一篇: 一天一篇(4)
请登录后发表评论 登录
全部评论

注册时间:2014-01-21

  • 博文量
    6
  • 访问量
    7050