2011-11-28 82 views
0

我已经阅读了关于此事的所有信息,但不幸没有一点帮助。我已经写了这个小功能龟etc的非阻塞版本:poll()在第一次调用后停止设置POLLIN

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已设置或返回负值。

例如: 主要包含此小while循环:

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

运行echo "Test" | ./a.out将产生只有T和随后循环而没有任何另外的输出。

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

回答

3

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

相关问题