Неблокирующий Получить Персонаж

Платформа: Linux 3.2.0 x86 (Debian 7)Компилятор: GCC 4.7.2 (Debian 4.7.2-5)

Я пишу функцию, которая читает один символ из стандартного ввода, если символ уже присутствует в стандартном вводе. Если stdin пуст, предполагается, что функция ничего не делает и возвращает -1. Я погуглил неблокирующий ввод и указал наопрос() или жеВыбрать(), Сначала я попытался использовать select (), но не смог заставить его работать, поэтому я попробовал poll () и пришел к тому же выводу. Я не уверен, что именно делают эти функции, но из того, что я понимаю из документации poll (), если я назову это так:

struct pollfd pollfds;
pollfds = STDIN_FILENO;
pollfds.events = POLLIN;
poll(pollfds, 1, 0);

if (pollfds.revents & POLLIN) будет истинным, если «Данные, отличные от данных с высоким приоритетом, могут быть прочитаны без блокировки.». Но poll () всегда прерывается в моей тестовой ситуации. Может быть проблема в том, как я тестирую функцию, но именно ту функциональность, которую я хочу, я и проверяю. Вот функция в настоящее время и тестовая ситуация.

#include <poll.h>
#include <stdio.h>
#include <unistd.h>

int ngetc(char *c)
{       
    struct pollfd pollfds;
    pollfds.fd = STDIN_FILENO;
    pollfds.events = POLLIN;

    poll(&pollfds, 1, 0);

    if(pollfds.revents & POLLIN)
    {
            //Bonus points to the persons that can tell me if
            //read() will change the value of '*c' if an error
            //occurs during the read
        read(STDIN_FILENO, c, 1);
            return 0;
    }
    else return -1;
}

//Test Situation:
//Try to read a character left in stdin by an fgets() call
int main()
{
    int ret = 0;
    char c = 0;
    char str[256];

    //Make sure to enter more than 2 characters so that the excess
    //is left in stdin by fgets()
    fgets(str, 2, stdin);

    ret = ngetc(&c);

    printf("ret = %i\nc = %c\n", ret, c);

    return 0;
}

Ответы на вопрос(2)

Ваш ответ на вопрос