【问题标题】:How to use select to read input from stdin?如何使用 select 从标准输入读取输入?
【发布时间】:2013-05-12 18:46:28
【问题描述】:

我正在尝试使用selectstdin 读取数据,之后我通过套接字将数据发送到服务器。

下面的sn-p应该遵循上面的逻辑;但它没有从stdin 中读取任何内容。

此外,它会在用户第一次输入字符串后打印Enter command:printf("%d %s\n",__LINE__ ,buf); 行也不打印任何内容。

fd_set rfds;
struct timeval tv;
int retval; 
char buf[BUFLEN];
while(1) {
    FD_ZERO(&rfds);
    FD_SET(STDIN_FILENO, &rfds);
    tv.tv_sec = 5;
    tv.tv_usec = 0;
    retval = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv);
    if (FD_ISSET(STDIN_FILENO, &rfds)) {
        if (fgets(buf,BUFLEN, stdin)) {
              printf("%d %s\n",__LINE__ ,buf);
          if (strncmp(buf, "exit", 4) == 0)
                exit(0);
         }
         printf("\nEnter command: ");
    }
}

为什么我只能无休止地打印Enter command:

编辑: 问题出在我使用的嵌入式设备上,并以某种方式用-fpic 编译它解决了问题。

【问题讨论】:

  • select 之前添加fflush(NULL);(以及FD_ZEROFD_SET ....)或更好地使用poll(2) 而不是select
  • 你是在命令后按回车吗?
  • 在您的代码中,您使用的是strncmp(p->buf,...。你的意思是使用strncmp(buf,...)
  • 我试过了,效果很好:ideone.com/SA8MCa
  • @0x90 如果您正在尝试进行测试,请稍后在使用套接字时实现select。改为了解pselect 将是一个好主意。 pselectselect 类似,但它允许你在收到信号时突破自身。

标签: c linux file-io stdin fgets


【解决方案1】:

试试

FD_ZERO(&rfds);
FD_SET(STDIN_FILENO, &rfds);

在while循环内

【讨论】:

  • 谢谢你,但即使你是对的,它也不能解决问题。编辑了我的问题。