poll () прекращает установку POLLIN после первого звонка - PullRequest
0 голосов
/ 28 ноября 2011

Я прочитал всю информацию, которую нашел по этому вопросу, и, к сожалению, ничего из этого не помогает. Я написал эту маленькую функцию как неблокирующую версию 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, а затем зациклится без дальнейшего вывода.

Буду признателен, если кто-нибудь сможет пролить свет на это.

1 Ответ

3 голосов
/ 28 ноября 2011

Потоки файлов <stdio.h> буферизуются . Смотрите setbuf для получения дополнительной информации. Вы можете напрямую использовать системный вызов read .

...