Il semble vraiment que OS X ait un bug lors de l'utilisation de Poll () sur un tuyau nommé (FIFO)… un expert peut-il confirmer?

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

  •  09-09-2019
  •  | 
  •  

Question

J'essaie de sonder à partir d'un ensemble de pipes nommées depuis un petit moment maintenant et je continue à obtenir une réponse immédiate de Pollnval sur n'importe quel descripteur de fichiers de tuyaux nommé. Après avoir trouvé ça Article de blog sur le sondage cassé dans OS X Je suis à peu près certain qu'il s'agit d'un bug dans OS X.

Je prévois déjà de passer mon code à l'utilisation de sockets UDP, mais je voulais demander ainsi une vérification à ce sujet a) afin que je sois sûr qu'il est vraiment cassé et b) à des fins de documentation.

Voici une version dépouillée du code que j'ai écrit (bien que le code dans le lien ci-dessus, que j'ai testé, l'épelle assez 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;
}

Cela sort:

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

à satiété.

Quelqu'un d'autre a rencontré cela? C'est un vrai bug, non?

Était-ce utile?

La solution

Cela semble être un véritable bug. Il fonctionne comme prévu sur Linux et OpenBSD et échoue comme vous le décrivez sur OS X.

Autres conseils

OSX 10.4.1, je peux confirmer le comportement. Le même code fonctionne bien (tant que les messages de délai d'expiration sont corrects) sur Linux. Toutes les preuves, y compris ceci - http://www.virtualbox.de/changeset/12347 - suggère qu'il y a un vrai problème.

Yup, bug connu. Je pense que la rupture du sondage n'est que depuis 10,4, nous avons dû y faire face à Fink. Glib's Configure.in a un test pour cela, vous pouvez donc être sûr que vous ne l'imaginez pas. (Eh bien, pas précisément cela, les tests GLIB pour le scrutin sur les appareils, pas les FIFOS.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top