【发布时间】:2017-11-21 17:42:39
【问题描述】:
fd_set read_fds;
struct timeval tv;
while(1){
tv.tv_sec = 3;
tv.tv_usec = 0;
FD_ZERO(&read_fds);
FD_SET(0,&read_fds);
FD_SET(pipelogin,&read_fds);
nfd = select(1,&read_fds,NULL,NULL,&tv);
if(FD_ISSET(0,&read_fds)){
printf("Comando"); }
//comandos();
if(FD_ISSET(pipelogin,&read_fds)){
printf("Login"); }
//VerificaLogin(pipelogin);
}
我的函数“comandos()”只是从用户那里读取命令并做一些事情,而函数 VerificaLogin(pipelogin) 只是让用户登录或不登录。我只能使用“comando”一次,而 VerificaLogin 只能在第一个“comando”之后工作......有人可以告诉我这里有什么问题吗? 抱歉英语不好。
【问题讨论】:
-
select的第一个参数至少应该是 1 加上集合中的最大文件描述符。由于集合中只有两个文件描述符0和pipelogin,那么pipelogin将是集合中的最大文件描述符,因此将第一个参数设置为pipelogin+1,如下所示:nfd = select(pipelogin+1,&read_fds,NULL,NULL,&tv);。 -
@IanAbbott 是的,谢谢,但一直在做同样的事情。
-
请提供一个最小的、可运行的问题演示。 (见minimal reproducible example。)
-
更喜欢 poll(2) 而不是旧的、几乎过时的
select。另外,在printf格式字符串的末尾放置一个\n,或使用fflush