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

时间:2011-11-28 08:08:26

标签: 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。

上面的功能是清理版本。我的版本有很多测试可以检查轮询错误。 Nether POLLERR已设置或返回负值。

示例: main包含这个小循环:

while(1){
    c=nonblocking_fgetc(stdin);
    if (c!=-1) {fputc(c, stdout);fflush(stdout);}
}    

运行echo "Test" | ./a.out只会产生T,然后循环而没有任何进一步的输出。

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

1 个答案:

答案 0 :(得分:3)

<stdio.h>文件流缓冲。有关详情,请参阅setbuf。您可以直接使用read系统调用。