1

POSIX 消息队列要求名称前面带有“/”是否有特殊原因?

例如,如果要尝试打开一个名为“thequeue”的消息队列。我将不得不使用:

mq_open("/thequeue", O_RDONLY);
4

1 回答 1

1

它不仅仅是消息队列,而是所有 POSIX IPC,包括信号量和共享内存。如果您必须将其归因于任何事情,那将是通常的 Unix 历史实现差异,再加上 POSIX 自己希望团结在这种情况下或多或少失败的事物的愿望。

Richard Stevens 在Unix Network Programming Vol II中专门为此做了一小部分。这些年来,我可能已经阅读了这些页面六次,但我仍然认为我无法充分总结他想说的话。他毫不含糊的是 POSIX.1 说:

  • 名称必须符合路径名的现有规则

  • 如果名称以斜杠开头,则不同的调用都引用相同的 IPC 对象。如果名称不以斜杠开头,则结果由实现定义。

  • 名称中附加斜线的实现是实现定义的。

sem_openmq_open和all的当前 POSIX 文档shm_open列出了以下限制:

  1. 未指定名称是否出现在文件系统中,并且对于将路径名作为参数的其他函数可见。

  2. name 参数符合路径名的构造规则,除了

    a) name 中除前导斜线字符之外的斜线字符的解释是实现定义的

    b) name 参数的长度限制是实现定义的,不需要与路径名限制 PATH_MAX 和 NAME_MAX 相同

    c) 如果 name 以斜杠字符开头,则调用具有相同 name 值的这些函数的进程将引用相同的 IPC 对象,只要该名称没有被删除。如果 name 不以斜杠字符开头,则效果是实现定义的。

换句话说,事情与史蒂文斯所描述的大致相同。

所有这些似乎都是一种非常冗长的说法,无论多么不令人满意,您需要 (1) 以斜线开头的名称和 (2) 在名称中不要使用其他斜线,否则您正在进入实现定义的领域。

于 2014-05-02T00:35:12.343 回答