在Linux消息队列的接收端放置什么密钥?

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

我已经使用IPC_PRIVATE作为发件人端msgget()密钥。

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

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

我还应该提到发件人部分中的msgsnd()表示一个错误(返回-1),但是使用perror()打印时,输出是Success并且将消息Success发送到消息队列,并可以使用ipcs – q命令在terminal。 我不知道为什么会发生这种情况。

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

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

您将不得不在两个独立进程之间使用公共密钥值…使用IPC_PRIVATE意味着您不打算在两个进程之间共享队列,除非从第一个进程分支了第二个进程。 由于分叉操作,子进程将与父进程的队列标识符固有,所以在该场景中使用IPC_PRVATE是可以的。 但是因为使用IPC_PRIVATE为每个使用的调用创建一个唯一的键值,对于有两个完全独立的进程(如服务器/客户端关系)的场景,您将需要创建一个公共密钥…它可以是你可以在所有已经被另一个队列,共享内存段等使用的进程之间共享的“幻数”,或者你也可以使用ftok()在文件系统中创建一个公用文件。

这个问题是你不应该使用古老的SysV消息队列的原因 – 没有什么好办法得到一个独特的密钥。 即使使用ftok ,碰撞也很有可能必须编写代码来解决这些问题。 假装你从来没有看到SysV IPC接口,而是使用POSIX消息队列。 看man mq_open