我已经阅读了我找到的有关此事的所有信息,不幸的是,这些信息都没有帮助。我将这个小函数编写为 fgetc 的非阻塞版本:
char nonblocking_fgetc(FILE *stream){
static struct pollfd pfd;
pfd.fd = fileno(stream);
pfd.events=POLLIN;
poll(&pfd, 1, 1);
return ((pfd.revents&POLLIN)?fgetc(stream):-1);
}
如果 stream
中存在该字符,则此函数应返回一个字符,否则返回 -1。它按第一次调用的预期工作。但是,任何后续调用都会返回 -1。
上面的函数是清理版本。我的版本有许多检查轮询错误的测试。设置下界 POLLERR 或返回负值。
示例: main 包含这个小的 while 循环:
while(1){
c=nonblocking_fgetc(stdin);
if (c!=-1) {fputc(c, stdout);fflush(stdout);}
}
运行 echo "Test"| ./a.out
将只产生 T,然后循环而没有任何进一步的输出。
如果有人能对此有所了解,我将不胜感激。
最佳答案
关于c - poll() 在第一次调用后停止设置 POLLIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8292993/