Linux消息队列的接收方有什么关键?

时间:2011-07-21 11:41:04

标签: c linux ipc message-queue

我创建了一个消息队列,发件人部分成功创建并将消息发送到消息队列。

我在发件人方IPC_PRIVATE中使用了msgget()作为密钥。

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

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

我还应该提到发件人部分中的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失败:成功

2 个答案:

答案 0 :(得分:3)

您将不得不在两个独立进程之间使用公共密钥值...使用IPC_PRIVATE意味着您不打算在两个进程之间共享队列,除非从第一个进程分叉了二级进程处理。由于分叉操作,子进程将固有来自父进程的队列标识符,因此在该方案中使用IPC_PRVATE是可以的。但是因为使用IPC_PRIVATE为其使用的每个调用创建一个唯一的键值,对于您有两个完全独立的进程的情况,例如服务器/客户端关系,您将需要创建一个公共密钥......它可以是您在另一个队列,共享内存段等尚未使用的所有进程之间共享的“幻数”,或者您可以使用{创建文件系统中公共文件的密钥。 {1}}。

答案 1 :(得分:1)

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