Obviamente, si está sondeando datos entrantes, debe consumir los datos disponibles (llamando a read()) o seguirá allí y la encuesta volverá inmediatamente. Simétricamente, ninguna operación es realmente necesaria para POLLOUT, pero normalmente desea llamar a la siguiente escritura() lo antes posible. Entonces, como regla general POLLIN -> leer, POLLOUT -> escribir.
También debe restablecer la estructura de pollfd antes de volver a llamar a la encuesta.
fds[0].fd = sck;
fds[0].events = POLLIN;
fds[0].revents = 0;
ret = poll(fds, 1, 2000); //2 secs timeout
if(fds[0].revents & POLLIN && ret > 0)
{
printf("event occur\n");
}
Si no pone a cero cada vez, la basura de llamada anterior puede cambiar el comportamiento de sondeo (bueno, en realidad no, esto es sólo un problema de la portabilidad).
En el código de producción también debe verificar el valor de retorno, ya que la encuesta puede haberse interrumpido por algún motivo diferente al esperado (como una señal). Entonces, generalmente, quiere volver a llamar en lugar de leer datos que no están disponibles (como recordatorio, el valor de retorno de la encuesta es el número de eventos, 0 tiempo de espera, -1 algún error, cuyo número está en errno).
También pueden producirse errores en los descriptores de archivos proporcionados para la encuesta. No harán que la encuesta devuelva un error, pero establecerán POLLERR, POLLHUP o POLLNVAL en el campo de resolución de la estructura pollfd para ese descriptor de archivo. Si estos eventos están configurados, llamar a read devolverá un código de error que puede verificar.
Gracias, pero no necesito leer esa información. Lo importante para mí es que haya un evento. ¿Crees que necesito leer eso? ¿Hay alguna manera en que pueda limpiar el búfer? – domlao
Creo que debes leer esa información. –
Veo, gracias, creo que necesito hacer eso. – domlao