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

关于select的一个死循环

时间:2014-09-07 21:09:25      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   数据   div   sp   代码   log   c   

#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的一个死循环

标签:blog   io   ar   数据   div   sp   代码   log   c   

原文地址:http://www.cnblogs.com/lhmily/p/3960753.html

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