【发布时间】:2014-06-18 11:27:18
【问题描述】:
POSIX 消息队列要求名称前面带有“/”是否有特殊原因?
例如,如果要尝试打开一个名为“thequeue”的消息队列。我将不得不使用:
mq_open("/thequeue", O_RDONLY);
【问题讨论】:
标签: posix ipc message-queue mqueue
POSIX 消息队列要求名称前面带有“/”是否有特殊原因?
例如,如果要尝试打开一个名为“thequeue”的消息队列。我将不得不使用:
mq_open("/thequeue", O_RDONLY);
【问题讨论】:
标签: posix ipc message-queue mqueue
不仅仅是消息队列,还有包括信号量和共享内存在内的所有 POSIX IPC。如果您必须将其归因于任何事情,那将是通常的 Unix 历史实现差异,再加上 POSIX 自己希望统一在这种情况下或多或少失败的事物的愿望。
Richard Stevens 在Unix Network Programming Vol II 中专门介绍了一小部分内容。这些年来,我可能已经阅读了这些页面六次,但我仍然认为我无法充分总结他想说的话。他毫不含糊的是POSIX.1说:
名称必须符合路径名的现有规则
如果名称以斜杠开头,则不同的调用都引用同一个 IPC 对象。如果名称不以斜杠开头,则结果为实现定义。
名称中附加斜杠的实现是实现定义的。
sem_open、mq_open 和 shm_open 的当前 POSIX 文档都列出了以下限制:
未指定名称是否出现在文件系统中以及是否对其他以路径名作为参数的函数可见。
name 参数符合路径名的构造规则,除了
a) name 中除前导斜线字符以外的斜线字符的解释是实现定义的
b) name 参数的长度限制是实现定义的,不必与路径名限制 PATH_MAX 和 NAME_MAX 相同
c) 如果 name 以斜杠字符开头,则调用具有相同 name 值的这些函数的进程将引用相同的 IPC 对象,只要该名称未被删除。如果名称不以斜线字符开头,则效果由实现定义。
换句话说,事情与史蒂文斯所描述的大致相同。
所有这些似乎都是一种非常冗长的说法,但不令人满意,您需要 (1) 以斜线开头的名称和 (2) 在名称中不要使用其他斜线,否则您正在进入实施 -定义的领土。
【讨论】: