Realmente parece OS X tiene un error al utilizar poll () en una tubería con nombre (FIFO) ... puede confirmar un experto?

StackOverflow https://stackoverflow.com/questions/591826

  •  09-09-2019
  •  | 
  •  

Pregunta

Estoy estado tratando de sondear a partir de un conjunto de tuberías nombradas por un tiempo ahora y me siguen dando una respuesta inmediata de POLLNVAL en cualquier descriptor de archivo canalización con nombre. Después de encontrar este post sobre el sondeo roto en OS X Estoy bastante seguro de que esta es una bug bug en OS.

Ya estoy pensando en cambiar mi código para utilizar sockets UDP, pero quería preguntarle SO para la verificación de este a) por lo que estoy seguro de que es realmente roto, y b) para fines de documentación.

Esta es una versión simplificada del código que he escrito (aunque el código en el enlace de arriba, que probé, lo explica bastante bien):

#includes
...
....
#

static const char* first_fifo_path = "/tmp/fifo1";
static const char* second_fifo_path = "/tmp/fifo2";

int setup_read_fifo(const char* path){
  int fifo_fd = -1;

  if( mkfifo(path, S_IRWXU | S_IRWXG | S_IRWXO) )
    perror("error calling mkfifo()... already exists?\n");

  if((fifo_fd = open(path, O_RDONLY | O_NDELAY)) < 0)
    perror("error calling open()");

  return fifo_fd;
}

void do_poll(int fd1, int fd2){
  char inbuf[1024];
  int num_fds = 2;
  struct pollfd fds[num_fds];
  int timeout_msecs = 500;

  fds[0].fd = fd1;
  fds[1].fd = fd2;
  fds[0].events = POLLIN;
  fds[1].events = POLLIN;

  int ret;
  while((ret = poll(fds, num_fds, timeout_msecs)) >= 0){
    if(ret < 0){
      printf("Error occured when polling\n");
      printf("ret %d, errno %d\n", ret, errno);
      printf("revents =  %xh : %xh \n\n", fds[0].revents, fds[1].revents);
    }

   if(ret == 0){
      printf("Timeout Occurred\n");
      continue;
    }                                                                   

    for(int i = 0; i< num_fds; i++){
      if(int event = fds[i].revents){

        if(event & POLLHUP)
          printf("Pollhup\n");
        if(event & POLLERR)
          printf("POLLERR\n");
        if(event & POLLNVAL)
          printf("POLLNVAL\n");

        if(event & POLLIN){
          read(fds[i].fd, inbuf, sizeof(inbuf));
          printf("Received: %s", inbuf);
        }
      }
    }
  }
}

int main (int argc, char * const argv[]) {
  do_poll(setup_read_fifo(first_fifo_path), setup_read_fifo(second_fifo_path));
  return 0;
}

Esto da salida:

$ ./executive 
POLLNVAL
POLLNVAL
POLLNVAL
POLLNVAL
POLLNVAL
POLLNVAL
POLLNVAL
POLLNVAL
POLLNVAL
...

hasta la saciedad.

Cualquier otra persona se encuentra con este? Se trata de un derecho real de errores?

¿Fue útil?

Solución

Esto parece ser un error genuino. Funciona como se esperaba en Linux y OpenBSD y no como usted la describe en OS X.

Otros consejos

OSX 10.4.1, puedo confirmar el comportamiento. El mismo código funciona bien (siempre y cuando los mensajes de tiempo de espera están bien) en Linux. Toda la evidencia, incluyendo este - http://www.virtualbox.de/changeset/12347 -. sugiere que existe un problema real

Sí, error conocido. Creo que la rotura de la encuesta es sólo a partir de 10,4, hemos tenido que tratar con él de Fink. configure.in de labia tiene una prueba para esto, por lo que puede estar seguro de que usted no está imaginando. (bueno, no precisamente este, pruebas elocuentes de sondeo en los dispositivos, no FIFOs.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top