operating-system - 为什么大多数 posix 命名对象都是用 unlink 设计的?

标签 operating-system resources posix glibc

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

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

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

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

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

最佳答案

因为它们是低级工具,可以在性能很重要时使用。在不使用该对象时将其删除,以便在下次使用时再次创建该对象,这会对保持其事件状态造成(轻微的)性能损失。

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

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

关于operating-system - 为什么大多数 posix 命名对象都是用 unlink 设计的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62954046/

相关文章:

gcc - 将Intel风格的汇编代码重写为GCC内联汇编

c++ - qemu-系统-i386 : Error loading uncompressed kernel without PVH ELF Note

c++ - 资源 (.rc) 文件中使用的语言?

Clang 无法编译 c11 程序,引用 "implicit declaration is illegal in c99"

linux - 如何从一行的开头获取正则表达式并将其复制到后续行的开头?

python - 使用inspect模块获取继承对象的名称

c - 为什么 va_arg 返回错误的数据?

带有图像资源的 iOS 静态库

java - 从类自己的 JAR 文件加载资源

c - 这个基于 fork 的模式是什么?