Sembra veramente OS X ha un bug quando si utilizza poll () su una named pipe (FIFO) ... può un esperto confermare

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

  •  09-09-2019
  •  | 
  •  

Domanda

Ho cercato di polling da un insieme di-named pipe per un po 'di tempo ormai e mi continuo a ricevere una risposta immediata di POLLNVAL su qualsiasi descrittore di file named pipe. Dopo aver trovato questo blog post su polling rotto in OS X Sono abbastanza certo che si tratta di una bug bug in OS X.

Sto già pensando di passare il mio codice per utilizzare i socket UDP, ma volevo chiedere SO per la verifica su questo a) in modo che io sono sicuro che è davvero rotto, e b) a scopo di documentazione.

Qui è una versione ridotta del codice che ho scritto (anche se il codice nel link qui sopra, che ho provato, incantesimi fuori abbastanza bene):

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

questo Uscite:

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

alla nausea.

Chiunque altro eseguito in questo? Questo è un vero e proprio bug?

È stato utile?

Soluzione

Questo sembra essere un vero e proprio bug. Esso funziona come previsto su Linux e OpenBSD e non riesce come lei su OS X.

Altri suggerimenti

OSX 10.4.1, posso confermare il comportamento. Lo stesso codice funziona bene (finché messaggi di timeout vanno bene) su Linux. Tutte le prove, compreso questo - http://www.virtualbox.de/changeset/12347 -. suggerisce che c'è un problema reale

Yup, noto bug. Credo che la rottura sondaggio è solo dal 10.4, abbiamo avuto a che fare con essa in Fink. configure.in di Glib ha un test per questo, in modo da poter essere sicuri che non stai immaginando. (beh, non proprio questo, i test glib per sondaggio sui dispositivi, non FIFO).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top