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) |