select与stdio混合使用的不良后果
参考以下链接自己补充实验: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);
}
}
用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