Cómo detectar un cambio de pin de un GPIO en la placa Linux

Estoy usando el kernel 3.12 en una placa Linux basada en ARM (CPU imx233). Mi propósito es detectar el cambio de pin de un GPIO (1 a 0).

Puedo leer el valor del pin constantemente llamando a la siguiente función (en un bucle while (1))

int GPIO_read_value(int pin){
    int gpio_value = 0;
    char path[35] = {'\0'};
    FILE *fp;
    sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
    if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
         //error
    }

    fscanf(fp, "%d", &gpio_value);
    fclose(fp);
    return gpio_value;
}

Pero causa demasiada carga a la CPU. Yo no usousleep onanosleep, porque el cambio de pin se realiza por un período de tiempo muy corto que me haría perder el evento.

Por lo que sé, no es posible usarpoll(). Hay algunapoll() ¿Qué función puedo usar para detectar un cambio de pin de un GPIO?

EDITAR: Por si acaso, si estoy haciendo algo mal, aquí está mipoll() uso que no detecta el cambio de pin

struct pollfd pollfds;
    int fd;
    int nread, result;
    pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
    int timeout = 20000;           /* Timeout in msec. */
    char buffer[128];

    if( pollfds.fd < 0 ){
        printf(" failed to open gpio \n");
        exit (1);
    }

    pollfds.events = POLLIN;
    printf("fd opens..\n");
    while (1)
    {
            result = poll (&pollfds, 0, timeout);
            switch (result)
            {
                  case 0:
                    printf ("timeout\n");
                    break;
                  case -1:
                    printf ("poll error \n");
                    exit (1);

                   default:
                printf("something is happening..\n");
                    if (pollfds.revents & POLLIN)
                    {
                        nread = read (pollfds.fd, buffer, 8);
                        if (nread == 0) {
                            printf ("result:%d\n", nread);
                            exit (0);
                         } else {
                            buffer[nread] = 0;
                            printf ("read %d from gpio: %s", nread, buffer);
                         }
                     }
              }
     }
     close(fd);

EDIT2: el código enhttps://developer.ridgerun.com/wiki/index.php/Gpio-int-test.c funciona bien conpoll() Necesitaba definir el borde ascendente / descendente para la interrupción y un poco de corrección en la definición. Resuelve mi problema, sin embargo, podría ser bueno para mí y para otras personas escuchar / conocer los métodos alternativos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta