今天刚刚看了APUE的fork函数那里,让我对I/O的缓冲有了新的认知,有段代码如下,完整代码的功能是调用fork函数产生一个子进程,并输出全局变量跟自由变量的值,然后父进程再输出全局变量跟自由变量的值,其中write函数是不带缓冲的,而标准的I/O库是带缓冲的,所以当我们执行含有下列代码的程序时,write只会将数据写到标准输出一次(因为不带缓冲)。而print有两种情况了,第一种是交互方式的运行该程序,只会输出一次,原因是终端的时候带行缓冲,输出中有‘\n’,所以缓冲区的数据被换行符给冲洗掉了。而第二种情况就是将标准输出重定向到一个文件是时,会得到两次输出,原因是父进程输出一次,但是数据还是在缓冲区中(没有被换行符冲洗,不是终端),数据被父进程复制到子进程中,子进程又输出了一次,所以输出了两次!
if(wirte(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1)
err_sys("write error");
printf("before fork\n");
再分享两点关于strlen跟sizeof之间的区别,第一点是strlen计算不含终止NULL字节的字符串长度,而sizeof包含。第二点是strlen需要进行一次函数调用,而sizeof在编译时计算缓冲区的长度!