명명 된 파이프 (FIFO)에서 poll ()를 사용할 때 OS X가 버그가있는 것처럼 보입니다. 전문가가 확인할 수 있습니까?

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

  •  09-09-2019
  •  | 
  •  

문제

나는 지금 잠시 동안 명명 된 파이프 세트에서 여론 조사를 시도하고 있으며, 이름이 지정된 파이프 파일 디스크립터에서 Pollnval에 대한 즉각적인 응답을 계속 받고 있습니다. 이것을 찾은 후 OS X에서 파손 된 폴링에 대한 블로그 게시물 나는 이것이 OS X의 버그 버그라고 확신합니다.

이미 코드를 UDP 소켓 사용으로 전환 할 계획이지만 a)에 대한 확인을 요청하고 싶었습니다.

다음은 내가 쓴 코드의 제거 버전입니다 (위의 링크의 코드는 테스트 한 코드는 꽤 잘 설명합니다).

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

이 출력 :

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

광고 구역.

다른 사람이 이것에 뛰어 들었습니까? 이것은 진짜 버그입니까?

도움이 되었습니까?

해결책

이것은 진정한 버그 인 것 같습니다. Linux 및 OpenBSD에서 예상대로 작동하며 OS X에서 설명 할 때 실패합니다.

다른 팁

OSX 10.4.1, 행동을 확인할 수 있습니다. Linux에서 동일한 코드가 정상적으로 작동합니다 (시간 초과 메시지가 적합한 한). 이것을 포함하여 모든 증거 - http://www.virtualbox.de/changeset/12347 - 실제 문제가 있다고 제안합니다.

예, 알려진 버그. 나는 여론 조사 파손이 10.4 이후에만 있다고 생각합니다. 우리는 그것을 Fink에서 다루어야했습니다. glib의 configure.in은 이것에 대한 테스트를 가지고 있으므로 상상하지 않는지 확인할 수 있습니다. (이것은 정확히 말하지만, FIFO가 아닌 장치에 대한 여론 조사에 대한 Glib 테스트입니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top