Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338120
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1293
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-07 11:17
个人简介

爱运动,爱看书,爱生活!

文章分类

全部博文(73)

文章存档

2014年(7)

2013年(66)

分类: LINUX

2013-03-30 21:30:22

 1 #include
  2 #include
  3 #include
  4
  5 int var=100;
  6 char buf[]="将写到标准输出里面去。\n";
  7 int main()
  8 {
  9    pid_t pid;
 10    int dw=2;
 11    /*STDOUT_FILENO是标准输出的文件描述符,
 12     *write()返回读到的字节数,用sizeof(buf)-1
 13     *作为写入长度是为了避免将结尾的null写入。*/
 14    if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1)
 15       printf("write error\n");
 16    printf("我如果采用重定向执行输出,会输出两次\n");/*\n是作为一个字符,此出没有冲洗缓冲区*/
 17    if((pid=fork())<0)
 18       printf("fork error.\n");
 19    else if(pid==0){
 20       var++;
 21       dw++;
 22    }else sleep(2);/*睡眠两秒是不确定的,我这只是为了保证子进程先执行*/
 23    printf("pid=%d,var=%d,dw=%d\n",getpid(),var,dw);
 24    return 0;
 25 }
 26
执行结果:
gcc father_and_children.c
a.out
将写到标准输出里面去。
我如果采用重定向执行输出,会输出两次
pid=11879,var=101,dw=3
pid=11878,var=100,dw=2
a.out > temp.out
cat temp.out
将写到标准输出里面去。
我如果采用重定向执行输出,会输出两次
pid=11882,var=101,dw=3
我如果采用重定向执行输出,会输出两次
pid=11881,var=100,dw=2
对这两种结果的分析:
为什么采用重定向输出,那句话输出了两次,而“将写到标准输出里面去”却没有,
这是因为write没有缓冲区,所以程序执行完write首先将“将写到标准输出里面去”
打印出来。但下面一句printf“我如果采用重定向执行输出,会输出两次。”是有缓冲的,
首先明确,创建子进程时子进程继承了父进程的缓冲,fork之前调用了printf一次,此
时是用换行符冲洗的缓冲区,在与IO设备发生交换时,它是行缓冲,否则是全缓冲。当直
接执行输出时,发生的是行缓冲,所以调用fork时,数据仍然还在缓冲区,每个进程终止
时最终才冲洗缓冲区副本,所以用重定向输出出现了两个“我如果采用重定向执行输出,会
输出两次。”
阅读(1204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~