2012-02-06 9 views
5

Soy nuevo en la programación de socket y estoy tratando de descubrir cómo funciona la encuesta. Así que hice un pequeño programa de ejemplo. El programa parece funcionar como lo espero, pero cuando comento la línea que tiene int dummy, el ciclo for solo ejecuta una iteración cuando se supone que debe hacer diez. Lo que no entiendo es cómo esa variable tiene algo que ver con el ciclo for. Se supone que el programa imprime "timeout" después de 3,5 segundos e imprime "return hit" si hay entradas disponibles.¿Cómo funciona la función de sondeo en c?

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

int main(int argc, char *argv[]) { 
    int a; 
    int b; 
    int c; 
    char buf[10]; 
    int i; 
    struct pollfd ufds[1];  
    ufds[0].fd = 0; 
    ufds[0].events = POLLIN; 
    int rv; 
    int dummy; 
    for(i=0; i < 10; i++) { 
     printf("%i ", i); 
     if((rv = poll(ufds, 2, 3500)) == -1) perror("select"); 
     else if (rv == 0) printf("Timeout occurred!\n"); 
     else if (ufds[0].revents & POLLIN) { 
      printf("return hit\n"); 
      read(0, buf, 10); 
     } 
     fflush(stdout); 
    } 
    return 0; 
} 

Respuesta

7
if((rv = poll(ufds, 2, 3500)) == -1) perror("select"); 
        ^

Usted está diciendo poll tiene 2 descriptores de archivos (estructuras pollfd 2), pero sólo tiene una. Eso es comportamiento indefinido (está engañando a la encuesta para que pise en la memoria no asignada). Cambiar ese argumento a 1.

+0

Por cierto, el póster original debería haber leído cuidadosamente la página de manual de 'poll', p. http://linux.die.net/man/2/poll –

2

El cambio en el comportamiento al comentar de salida dummy es probablemente debido a cambios en la pila que ufds efecto y el hecho de que está pasando el valor incorrecto nfds en poll(). También debe restablecer los valores de pollfd.revents antes de la siguiente llamada al poll().

Cuestiones relacionadas