select()返回不为0,但是read()返回0个字节??

版权声明:转载请注明出处 https://blog.csdn.net/qq_36337149/article/details/82690812

我有一段代码这样写的:

char buf[maxMessageSize];
    int maxfdp1;
    fd_set rset;
    FD_ZERO(&rset);
    //setbuf(stdout,NULL);
    while(1){
        printf("\r$ ");
        bzero(buf,maxMessageSize);
        FD_SET(fileno(stdin),&rset);
        FD_SET(sockfd,&rset);

        maxfdp1=MAX(fileno(stdin),sockfd)+1;
        select(maxfdp1,&rset,NULL,NULL,NULL);

        if(FD_ISSET(fileno(stdin),&rset)){

            if(select_read == 1){
                fgets(buf,maxMessageSize,stdin);
                if(strlen(buf) != 0){//处理标准输入读取的命令
                    delStdinInput(sockfd,buf);
                }else{
                    int flag = fcntl(fileno(stdin),F_GETFL,0);
                    fcntl(fileno(stdin),F_SETFL,flag&(~O_NONBLOCK));
                    printf("the %d time read 0 bytes????\r",c++); //
                }
            }
        }

        if(FD_ISSET(sockfd,&rset)){
            readClientRecv(sockfd);
        }
    }

但是运行的时候是发现select返回了,但是从标准输入读总是读到0个字节。一开始以为是哪里设置成非阻塞了,但是,加上设置成阻塞的代码并没解决问题。后面联想到套接字对端发送FIN的情况,于是想着是不是哪里把标准输入给close()了,果然,通过Ctrl+F找到了下面这句:

close(g_cliUserdata->m_filefd);

看来还是不能偷懒,在close()之前必须得先检查一下参数,写成这样就没事了。

if(g_cliUserdata->m_filefd > 2){
    close(g_cliUserdata->m_filefd);
    g_cliUserdata->m_filefd = -1;
}

tig:(文件描述符0、1、2)–>(stdin、stdout、stderr)

猜你喜欢

转载自blog.csdn.net/qq_36337149/article/details/82690812