如何从stdin和套接字同时轮询?

时间:2016-05-03 18:00:10

标签: c linux sockets stdin polling

我想编写一个同时等待来自stdin和套接字的数据的C程序。为此,我想使用poll()

但似乎我误解了pollstdin的作用...我希望它的行为就像它在套接字上的行为一样,即:报告POLLIN当且仅当我实际上在终端中输入了一些东西(最好也按下了RETURN)。

为了测试这个假设是否正确,我写了一个poll仅在stdin上的简单程序:

#include <poll.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

int main()
{
  int ret_poll; ssize_t ret_read;
  struct pollfd input[1] = {{fd: 0, events: POLLIN}};
  char buff[100];
  while(1) {
    ret_poll = poll(input, 1, 0);
    printf("ret_poll:\t%d\nerrno:\t%d\nstrerror:\t%s\n",
        ret_poll, errno, strerror(errno));
    ret_read = read(0, buff, 99);
    printf("ret_read:\t%zd\nerrno:\t%d\nstrerror:\t%s\nbuff:\t%s\n",
        ret_read, errno, strerror(errno), buff);
  }
}

但是,我发现在上面的示例中(当我告诉poll等待POLLIN上的stdin时)poll会立即返回,无论是否我其实是在打字。然后,当然,后续read() stdin块。所以我想这意味着我不能同时从输入到终端和套接字等待:(

只有在确实有要阅读的数据时,是否可以在pollPOLLIN报告stdin

1 个答案:

答案 0 :(得分:3)

正如上面提到的@Roecrew,poll()立即返回,因为你给了0超时。正如man page所说:

  

请注意,超时间隔将向上舍入到系统   时钟粒度和内核调度延迟意味着阻塞          间隔可能会少量超出。在超时中指定负值意味着无限超时。指定超时   零          导致poll()立即返回,即使没有文件描述符准备就绪。

如果你改变: ret_poll = poll(input, 1, 0);ret_poll = poll(input, 1, -1);它会按预期工作。