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