首页 > 代码库 > 关于select的一个死循环
关于select的一个死循环
#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <sys/select.h>int main(int argc, char *argv[]){ int maxfd; char buf[256]; fd_set rset; while(1){ FD_ZERO(&rset); FD_SET(STDIN_FILENO,&rset); select(STDIN_FILENO+1,&rset,NULL,NULL,NULL); if(FD_ISSET(STDIN_FILENO,&rset)) printf("hello world!\n"); } return 0;}
上述代码会出现死循环的情况。
select对fd的监听等同于对fd的缓冲区的监听。当fd的缓冲区有数据可读时,select返回。当输入任意字符,比如:“abc”,则“abc”被放在标准输入的缓冲当中,此时缓冲中有数据(abc)待读,所以select返回STDIN_FILENO就绪,程序输出“hello World!”。紧接着进入下一次循环,select重新将STDIN_FILENO加入监听的描述符集,由于刚刚的“abc”并没有被读出,所以仍在缓冲中,此时STDIN_FILENO的缓冲中仍有数据等待读,所以select又返回STDIN_FILENO可读就绪,又一次输出“hello world!”。之后循环情况类似,由于缓冲的的“待读”数据始终还在,所以每次select都直接返回STDIN_FILENO就绪,每次都输出“hello world!”,这就是造成程序死循环的原因。
关于select的一个死循环
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。