版权声明:转载请注明出处 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)