创建多个消息队列,使用队列的唯一键

Creation of Multiple Message Queues, with Unique Keys for the queues

我们为消息从一个进程传递到另一个进程创建了多个队列。但有时消息队列的键会重叠(不同队列的键相同)。为了避免这种情况,我考虑将 IPC_PRIVATE 与用于创建消息队列的函数 msgget() 一起使用。

这个link说我应该使用IPC_PRIVATE,我的申请很关键,所以我必须避免目前的情况。 这个 msgget 的语法是 int msgget(key_t key, int msgflg);。 请告诉我使用 IPC_PRIVATE 的 msgget 的语法,它是否会解决我的问题?

Please tell me the syntax for msgget with IPC_PRIVATE

IPC_PRIVATEkey_t 类型的值。您将其作为文字键值传递:

int flags = /* ... permission bits ... */;
int my_mq = msgget(IPC_PRIVATE, flags);

使用IPC_PRIVATE时,不需要在标志中包含IPC_CREATIPC_EXCL;如果您确实包含它们,那么它们将被忽略。

and wether it will solve my issue ?

每次使用键 IPC_PRIVATE 成功调用 msgget() 都会创建一个新的消息队列和 returns 它的标识符,因此这种方法肯定会防止无意的队列共享。但是,它也使得执行 有意 队列共享变得更加困难,这可能会给您带来自己的问题。毕竟,消息队列是一种 IPC 机制,因此您似乎确实希望某些进程共享队列。促进这一点是基于键的队列访问的重点。

作为替代方案,访问队列的常用方法围绕着使用 ftok() 生成密钥,基于一个众所周知的或可计算的文件名。文件名可能是工作目录、中央可执行文件或配置文件的文件名。 By appropriate choice of the distinguishing file, different groups of cooperating executables can obtain different keys. ftok() 的第二个参数使协作进程能够生成(相同的)一组最多 256 个公共密钥。