我创建了一个消息队列,发件人部分成功创建并将消息发送到消息队列。
我在发件人方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失败:成功
答案 0 :(得分:3)
您将不得不在两个独立进程之间使用公共密钥值...使用IPC_PRIVATE
意味着您不打算在两个进程之间共享队列,除非从第一个进程分叉了二级进程处理。由于分叉操作,子进程将固有来自父进程的队列标识符,因此在该方案中使用IPC_PRVATE
是可以的。但是因为使用IPC_PRIVATE
为其使用的每个调用创建一个唯一的键值,对于您有两个完全独立的进程的情况,例如服务器/客户端关系,您将需要创建一个公共密钥......它可以是您在另一个队列,共享内存段等尚未使用的所有进程之间共享的“幻数”,或者您可以使用{创建文件系统中公共文件的密钥。 {1}}。
答案 1 :(得分:1)
这个问题是你不应该使用古老的SysV消息队列的原因 - 根本没有办法获得一个独特的密钥。即使使用ftok
,冲突也很可能必须编写代码才能尝试解决它们。假装您从未见过SysV IPC接口并使用POSIX消息队列;见man mq_open
。