Sin bloqueo Obtener carácter

Plataforma: Linux 3.2.0 x86 (Debian 7)Compilador: GCC 4.7.2 (Debian 4.7.2-5)

Estoy escribiendo una función que lee un solo carácter de stdin si un personaje ya está presente en stdin. Si la entrada estándar está vacía, se supone que la función no hace nada y devuelve -1. Busqué en Google sin bloqueo de entrada y se apuntó aencuesta() oseleccionar(). Primero intenté usar select () pero no pude hacer que funcionara, así que probé poll () y llegué a la misma conclusión. No estoy seguro de qué hacen estas funciones exactamente, pero a partir de lo que entiendo de la documentación de poll () si lo llamo así:

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

if (pollfds.revents & POLLIN) será verdadero si "Los datos que no sean de alta prioridad se pueden leer sin bloquear". Pero poll () siempre supera el tiempo en mi situación de prueba. La forma en que pruebo la función podría ser el problema, pero la funcionalidad que quiero es exactamente lo que estoy probando. Aquí está la función actualmente y la situación de prueba también.

#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;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta