我想编写一个同时等待来自stdin
和套接字的数据的C程序。为此,我想使用poll()
。
但似乎我误解了poll
对stdin
的作用...我希望它的行为就像它在套接字上的行为一样,即:报告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
块。所以我想这意味着我不能同时从输入到终端和套接字等待:(
只有在确实有要阅读的数据时,是否可以在poll
上POLLIN
报告stdin
?
答案 0 :(得分:3)
正如上面提到的@Roecrew,poll()
立即返回,因为你给了0超时。正如man page所说:
请注意,超时间隔将向上舍入到系统 时钟粒度和内核调度延迟意味着阻塞 间隔可能会少量超出。在超时中指定负值意味着无限超时。指定超时 零 导致poll()立即返回,即使没有文件描述符准备就绪。
如果你改变:
ret_poll = poll(input, 1, 0);
到ret_poll = poll(input, 1, -1);
它会按预期工作。