我已经阅读了关于这件事的所有信息,不幸的是,这些信息都没有帮助。我把这个小函数写成了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。
上面的函数是清理版本。我的版本有许多检查轮询错误的测试。设置Nether POLLERR或返回负值。
例子:
main包含这个小while循环:
while(1){
    c=nonblocking_fgetc(stdin);
    if (c!=-1) {fputc(c, stdout);fflush(stdout);}
}

运行echo "Test" | ./a.out将只产生T,然后循环而不产生任何进一步的输出。
如果有人能透露一些情况,我将不胜感激。

最佳答案

文件流被缓冲。更多信息请参见setbuf。您可以直接使用read系统调用。

09-06 03:54