首页 > 解决方案 > 为什么大多数 posix 命名对象都设计为取消链接?

问题描述

大多数 POSIX 命名对象(或全部?)具有取消链接功能。例如: shm_unlink mq_unlink

它们都有一个共同点,即它们从系统中删除对象的名称,导致下一次打开失败或创建一个新对象。

为什么会这样设计?我知道,这与“一切都是文件”政策有关,但为什么不在关闭时删除文件呢?如果您创建一个新界面,您会这样做吗?

我认为,这有一个很大的缺点。比如说,我们有一个服务器进程和几个客户端进程。如果任何进程(错误地)断开对象的链接,所有新客户端都不会找到服务器。(这可以通过相应文件的用户权限来禁止,但仍然......)

如果它具有引用计数并且在关闭最后一个对象时会自动删除名称,那不是更好吗?为什么要保持开放?

标签: operating-systemresourcesposixglibc

解决方案


因为它们是低级工具,可以在性能很重要时使用。在不使用对象时删除它,以便在下次使用时再次创建它,对保持它的活动有(轻微的)性能损失。

我曾经使用过一个命名信号量,它用于将对假脱机的访问与各种生产者和消费者同步。我使用了一个 init 模块来创建命名信号量,该信号量在引导过程中被调用,并且所有其他进程都知道应该存在众所周知的信号量。

如果您想要一种对程序员更友好的方式来按需创建对象并在不再使用时将其销毁,您可以构建更高级别的库并将创建/取消链接操作封装在其中。但是如果系统调用包含它,就不可能构建一个用户级库来避免它。


推荐阅读