c mq_open () не подключается, если вызывается до открытия очереди сообщений - PullRequest
0 голосов
/ 04 апреля 2020

Итак, у меня есть два процесса. Каждый из них создает свою очередь сообщений и пытается подключиться друг к другу. Однако по какой-то причине это работает только в одном направлении.

Процесс один имеет следующее:

struct mq_attr attr;
  int flags = O_RDWR | O_CREAT;
  attr.mq_flags = 0;
  attr.mq_maxmsg = 3; // ***
  attr.mq_msgsize = sizeof(cache_request);
  attr.mq_curmsgs = 0;

  mqd_t fd, fd2;
  mq_unlink("/mq_one");
  fd2 = mq_open("/mq_two", flags,(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),&attr );
  while((fd = mq_open("/mq_one", O_RDWR)) == -1){
    printf("Couldnt connect to message queue in cache\n");
    sleep(2);
  }
  mq_close(fd2);
  mq_unlink("/mq_two");


  printf("connected to message queue.\n");

Процесс два имеет следующее:

mqd_t fd, fd2;
    //mq_unlink("/mq_one");
    struct mq_attr attr;
    int flags = O_RDWR | O_CREAT;
    attr.mq_flags = 0;
    attr.mq_maxmsg = 3; // ***
    attr.mq_msgsize = sizeof(cache_request);
    attr.mq_curmsgs = 0;

    fd = mq_open("/mq_one", flags,(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),&attr );
    printf("opened message queue /mq_one.\n");
    if (fd < 0) {
            printf ("   Error %d (%s) on server mq_open.\n",errno, strerror (errno));
            mq_close(fd);
            mq_unlink("/mq_one");
        exit (1);
    }
        while((fd2 = mq_open("/mq_two", O_RDWR)) == -1){
        printf("waiting on webproxy...\n");
        sleep(2);
      }
        mq_close(fd2);
        mq_unlink("/mq_two");

По существу, каждый процесс открывает (создает) свою собственную очередь сообщений, а затем ожидает другого при попытке установить соединение. Проблема в том, что это работает, только если процесс запускается раньше, чем процесс два, а не наоборот. Если я сначала запускаю процесс 2, то когда я запускаю процесс 1, процесс 2 выходит из l oop и продолжает работать, но процесс 1 остается в l oop, даже если он должен видеть первую очередь сообщений. Я не могу понять, почему это так.

1 Ответ

1 голос
/ 04 апреля 2020

Вам необходимо решить две проблемы: * время удаления mq_one в процессе P1 * Работа с постоянным (левое соединение)

Когда вы запускаете P2 до P1, P2 создаст / mq_ope, но P1 удалит Это. В этот момент P1 будет (навсегда) ожидать / mq_one, но P2 не будет пытаться снова создать p1.

Рассмотрим другую стратегию: * Каждая программа (P1, P2) будет удалять только очередь, которую она создала, при выходе.

Это должно позволить программам работать правильно независимо от времени (кто запускается первым) и независимо от состояния (есть ли остаток от предыдущего запуска).

...