码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-10 06:24:35      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

参考以下链接自己补充实验: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在用户跟内核都有缓冲
技术分享
 当从键盘输入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
技术分享
 










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

标签:

原文地址:http://www.cnblogs.com/zengyiwen/p/5755216.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!