select与stdio混合使用的不良后果
2016-08-10 00:58
113 查看
参考以下链接自己补充实验:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.aspx?opt=admin
[/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)
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)
相关文章推荐
- select函数与stdio混用的不良后果
- jstl if和foreach的混合使用 实现通过后台值控制select默认选项的功能【实例】
- select函数与stdio混用的不良后果 (转)
- 使用osql.exe, 将Select的内容保存为文件
- 测试了3种获取中英文混合字符串长度的方法,看来还是使用循环来的快
- 使用混合脚本编程来实现的Base64解码
- apache限制ip和用户认证的混合使用方法一
- 小心使用select的length属性
- DataGrid和CheckBox的混合使用
- select 函数使用指难
- VC6 Stdio 使用技巧及问题收集(2) zz
- More Effective C++ Item M34:如何在同一程序中混合使用C++和C
- 汇编语言与C语言的混合使用
- 如何混合使用C和C++(上)
- 关于custom:select的使用总结
- DataGrid和CheckBox的混合使用
- 如何在DataTable中灵活使用Select方法
- java和struts使用中的一点总结--关于写在页面上的select域的选项选中后保存状态的办法!
- 注意:以下文章只为各位DOTNET爱好者个人学习或研究使用,不得用于任何商业用途,否则后果自负
- 汇编语言与C语言的混合使用