您的位置:首页 > 其它

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

2016-08-10 00:58 113 查看
参考以下链接自己补充实验:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.aspx?opt=admin
int main(int argc,char *argv[]){

fd_set rfd;

char buf[3]={0};

FD_ZERO(&rfd);

while(1){

FD_SET(fileno(stdin),&rfd);

select(1,&rfd,0,0,0);

printf("standard input your data come in\n");

fgets(buf,3,stdin);

printf("buf=%s\n",buf);

}


}

[/code]用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


来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: