【问题标题】:What key to put on the receiver side of Linux message queues?在 Linux 消息队列的接收方放置什么键?
【发布时间】:2011-10-10 03:57:55
【问题描述】:

我已经创建了一个消息队列,并且发送方部分成功创建并发送消息到消息队列中。

我使用IPC_PRIVATE 作为发送方的msgget() 的密钥。

现在我的问题是,在接收方的msgget() 中使用什么键?

在接收方使用IPC_PRIVATE 作为msgget() 中的key 不会收到消息并且失败。

我还要提一下,发送方部分的msgsnd()表示错误(返回-1),但是用perror()打印时,输出为Success,消息成功发送到消息队列,可以在终端使用 ipcs -q 命令可以看到。我不知道为什么会这样。

 if(msgsnd(msqid,&msgp,88,IPC_NOWAIT) == 0)
          {
                  perror("\nsend : msgsnd FAIL");
                  msgctl(msqid,IPC_RMID,buf);
                  return 1;
          }

输出: 发送:msgsnd 失败:成功

【问题讨论】:

    标签: c linux ipc message-queue


    【解决方案1】:

    这个问题是您不应该使用古老的 SysV 消息队列的原因 - 根本没有获得唯一密钥的好方法。即使使用ftok,冲突也很有可能,您必须编写代码来尝试解决它们。假装你从未见过 SysV IPC 接口,而使用 POSIX 消息队列;见man mq_open

    【讨论】:

      【解决方案2】:

      您将不得不在两个独立进程之间使用公共键值...使用IPC_PRIVATE 意味着您不打算在两个进程之间共享队列,除非辅助进程已从第一个进程分叉。由于分叉操作,子进程将继承父进程的队列标识符,因此在这种情况下使用IPC_PRVATE 是可以的。但是因为使用IPC_PRIVATE 会为其使用的每个调用创建一个唯一的键值对,对于您有两个完全独立的进程的场景,例如服务器/客户端关系,您将需要创建一个公共键......它可以要么是您在其他队列、共享内存段等尚未使用的所有进程之间共享的“幻数”,要么您可以使用 ftok() 在文件系统中创建一个公共文件的密钥.

      【讨论】:

      • 为什么我会在 msgsnd 的 perror() 部分收到 Success 作为错误消息?
      • 为什么“send : msgsnd FAIL: Success”会出现成功
      • SUCCESS 表示您返回了 0 的值,这就是您要检查的内容。如果你想检查失败,你必须做if(msgsnd(msqid,&msgp,88,IPC_NOWAIT) == -1),然后通过perror()检查errno的值,此时它已被设置为非零值。
      • 感谢 jason 指出我的错误,我在编码时错过了 -1
      猜你喜欢
      • 2013-02-07
      • 2012-03-22
      • 2012-01-19
      • 1970-01-01
      • 2010-09-19
      • 2012-11-16
      • 2013-12-06
      • 2011-07-10
      • 2011-07-15
      相关资源
      最近更新 更多