select与stdio混合使用的不良后果

参考以下链接自己补充实验: http://www.cppblog.com/mysileng/archive/2013/01/15/197284.aspx?opt=admin
 
   
  1. int main(int argc,char *argv[]){
  2. fd_set rfd;
  3. char buf[3]={0};
  4. FD_ZERO(&rfd);
  5. while(1){
  6. FD_SET(fileno(stdin),&rfd);
  7. select(1,&rfd,0,0,0);
  8. printf("standard input your data come in\n");
  9. fgets(buf,3,stdin);
  10. printf("buf=%s\n",buf);
  11. }
  12. }
用stdin跟fgets在用户跟内核都有缓冲
836125-20160810005622121-1633363127.png
 当从键盘输入123456789+回车,开始保存到stdin用户缓冲.但看到回车(\n)就刷入到内核缓冲区,select发现stdin在内核缓冲区有数据.于是不阻塞.接着调用fgets,fgets发现用户缓冲区没数据.于是从内核读取一行(123456789\n),放到用户缓冲区.接着读取2个(1,2)..用户缓冲区还剩下3456789\n.但内核已经空了.select发现内核缓冲区空了.那就会阻塞.
------前方高能.当继续输入1+回车的时候,因为之前fgets用户缓冲区有剩余数据(3456789\n).输入1+回车.将使得内核有1\n数据,select不阻塞.于是fgets看到用户缓冲区有数据就直接读取.并不从内核缓冲区读取.于是把3456789\nqu
836125-20160810005623137-1920637839.png
 










转载于:https://www.cnblogs.com/zengyiwen/p/5755216.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值