【问题标题】:Select not working Unix C选择不工作的 Unix C
【发布时间】: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 加上集合中的最大文件描述符。由于集合中只有两个文件描述符0pipelogin,那么pipelogin 将是集合中的最大文件描述符,因此将第一个参数设置为pipelogin+1,如下所示:nfd = select(pipelogin+1,&read_fds,NULL,NULL,&tv);
  • @IanAbbott 是的,谢谢,但一直在做同样的事情。
  • 请提供一个最小的、可运行的问题演示。 (见minimal reproducible example。)
  • 更喜欢 poll(2) 而不是旧的、几乎过时的 select。另外,在printf 格式字符串的末尾放置一个\n,或使用fflush

标签: c unix select pipe


【解决方案1】:

select 函数是一个状态报告函数。除非状态发生变化,否则它将继续报告相同的状态。

此外,您应该永远select 与阻塞套接字一起使用。那只会带来痛苦。

【讨论】:

    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多