select()返回不為0,但是read()返回0個位元組??
阿新 • • 發佈:2018-11-05
我有一段程式碼這樣寫的:
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)