c - poll() 在第一次调用后停止设置 POLLIN

标签 c linux stdin std

我已经阅读了我找到的有关此事的所有信息,不幸的是,这些信息都没有帮助。我将这个小函数编写为 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,然后循环而没有任何进一步的输出。

如果有人能对此有所了解,我将不胜感激。

最佳答案

<stdio.h>文件流被缓冲。参见 setbuf更多。您可以直接使用 read系统调用。

关于c - poll() 在第一次调用后停止设置 POLLIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8292993/

相关文章:

linux - 如何回显包含双引号的文本

c - Linux C 选择 : piping echo to input works, 但从键盘读取却没有?

C:对 LibConfuse 内部函数的 undefined reference

c - 在 Ada 中访问 C 字符串时出现段错误

c - xmlReadMemory 不保留原始格式的空节点

c++ - 跨平台 svn 管理(Makefiles & Visual Studio)

linux - 从终端启动 Sublime 3,默认为 Sublime Text 2

java - Node.js:如何写入 java-childprocess-stdin

python - 如何实现标准输入、标准输出包装器?

python - 如何从覆盆子模拟 dualshock 3 垫的按钮按下