1. 程式人生 > >select()返回不為0,但是read()返回0個位元組??

select()返回不為0,但是read()返回0個位元組??

我有一段程式碼這樣寫的:

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)