I/O缓冲,strlen跟sizeof小分享

今天刚刚看了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在编译时计算缓冲区的长度!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值