[c mq_open(),如果在消息队列打开之前被调用,则不会连接

问题描述 投票:0回答:1

所以我有两个过程。它们各自创建自己的消息队列,并尝试彼此连接。但是,由于某种原因,这只能以一种方式起作用。

进程一具有以下内容:

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退出循环并继续运行,但是进程1仍处于循环中,即使它应该看到第一个消息队列也是如此。我不知道为什么会这样。

c posix ipc message-queue
1个回答
0
投票

您必须处理两个问题:*在进程P1中删除mq_one的时间*处理持久性(左连接)

当您在P1之前启动P2时,P2将创建/ mq_ope,但是P1将删除它。此时,P1将(永远)等待/ mq_one,但P2不会再次尝试创建p1。

考虑不同的策略:*每个程序(P1,P2)仅在退出时才删除其创建的队列。

这将使程序无论何时运行(谁先启动),无论状态如何(前一次运行是否有剩余,都可以正常工作。)>

© www.soinside.com 2019 - 2024. All rights reserved.