يبدو الأمر حقا مثل OS X لديه خطأ عند استخدام الاستطلاع () على أنبوب مسمى (FIFO) ... هل يمكن أن يؤكد خبير؟

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

  •  09-09-2019
  •  | 
  •  

سؤال

أحاول استطلاع من مجموعة من الأنابيب المسماة لفترة قصيرة الآن وأستمر في الحصول على استجابة فورية من Pollnval على أي واصف ملف أنبوب مسمى. بعد العثور على هذا وظيفة بلوق عن الاقتراع المكسور في OS X أنا من المؤكد أن هذا هو علة علة في نظام التشغيل X.

أخطط بالفعل لتبديل التعليمات البرمجية الخاصة بي لاستخدام مآخذ UDP، لكنني أردت أن أسأل لذلك للتحقق من هذا A) حتى أكون متأكدا من كسرها حقا، و B) لأغراض التوثيق.

فيما يلي نسخة مخطوعة من التعليمات البرمجية، كتبت (على الرغم من أن التعليمات البرمجية في الرابط أعلاه، والتي اختبرتها، تعويها جيدا):

#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 وفشل أثناء تصفك على نظام التشغيل X.

نصائح أخرى

OSX 10.4.1، يمكنني تأكيد السلوك. نفس الرمز يعمل بشكل جيد (طالما رسائل المهلة بخير) على Linux. كل الأدلة، بما في ذلك هذا - http://www.virtualbox.de/changeset/12347. - يقترح أن هناك مشكلة حقيقية.

نعم، علة معروفة. أعتقد أن كسر الاستطلاع هو فقط منذ 10.4، كان علينا التعامل معها في فينك. Glib's Configure.in لديه اختبار لهذا، حتى تتمكن من التأكد من أنك لا تتخيلها. (حسنا، ليس بالضبط هذا، اختبارات Glib للاستطلاع على الأجهزة، وليس Fifos.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top