Operating system 为什么大多数posix命名对象都设计为取消链接?

Operating system 为什么大多数posix命名对象都设计为取消链接?,operating-system,resources,posix,glibc,Operating System,Resources,Posix,Glibc,大多数POSIX命名对象(或全部?)具有取消链接的函数。例如: 它们都有一个共同点,即从系统中删除对象的名称,导致next Open失败或创建新对象 为什么设计成这样?我知道,这与“一切都是文件”策略有关,但为什么不在关闭时删除文件?如果您创建一个新接口,您会这样做吗 我认为,这有一个很大的缺点。比如说,我们有一个服务器进程和几个客户端进程。如果任何进程(错误地)取消了对象的链接,那么所有新客户机都找不到服务器。(这可以被相应文件的用户权限禁止,但仍然…) 如果它有引用计数,并且在最后一个对象

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

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

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

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


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

因为它们是低级别的工具,可以在性能重要时使用。如果在下次使用时不使用该对象再次创建该对象,则删除该对象会对其保持活动状态造成(轻微)性能损失

我曾经使用过一个命名的信号量,用于与不同的生产者和消费者同步对spool的访问。我使用一个init模块来创建命名的信号量,该信号量作为引导过程的一部分被调用,而所有其他过程都知道这个众所周知的信号量应该存在

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

如果它有引用计数,并且在最后一个对象关闭时自动删除名称,这不是更好吗

没有

因为
unlink()
可能会失败,而且当所有进程仅仅关闭一个资源时,总是取消一个可以在进程之间共享的资源的链接根本不符合共享资源的范例


你不会因为没有人排队等着在那一刻再次乘坐云霄飞车而拆毁云霄飞车。

基本原理()建议它们应该可以通过
open
mmap
实现,但POSIX的其他部分没有“无人打开时自动取消链接的文件”的概念,因此,可能是因为易于实现。只是为了澄清一下,大多数文件对象都有引用计数,打开的文件即使在其他进程取消链接后,仍然可以被具有文件描述符的程序访问。当前没有进程使用对象(已关闭)与将来没有进程需要使用对象(未链接)之间存在语义上的区别。我确信这不是因为杀死未使用的对象会影响性能,而不是给用户提供处理对象的显式选项。通常,没有使用对象的进程并不意味着将来没有对象会使用该对象。在我看来,
打开
/
关闭
界面允许进程与对象交互,而
创建
/
取消链接
界面允许创建对象,当程序员认为不再需要时将其删除。我怀疑这是原因。您可以构建一个更高级别的库,并将创建/取消链接操作封装在其中,从而产生如何处理崩溃的问题,从而保留资源。“嘿,这还不应该存在?!”@AndrewHenle:我从来没有假装编写这样一个库会很容易,因为有很多极端情况,需要大量的错误处理代码。“但这至少是可能的。”谢尔盖·巴列斯塔你知道,我知道。但是,考虑这种设计的其他人可能还没有考虑到所有的含义……我肯定OP是在问为什么POSIX在最后一个句柄关闭后立即删除对象时,不对共享对象使用Windows语义。这样做很有意义。POSIX在这里设计得非常糟糕,重复了SysV IPC对象的错误。@StaceyGirl我怀疑Windows的语义实际上是否优越。例如,如果某个生产者在其工作完成时退出,那么如果消费者当时没有运行,那么由某个生产者发布的共享信号量将被删除。删除共享资源需要是一个明确的决定。您正在描述一个流程与另一个可能尚未启动的流程交互时的用例。如果有这样的用例,它可能会更好地与非易失性内存一起工作,因为这样的信息可能会比系统关闭时间更长。使用进程的一个要点是允许系统处理崩溃,这意味着自动清理资源,相反,我们得到了另一个界面,该界面生成未使用的对象,需要手动干预来清理它们。@StaceyGirl“更好”这完全是主观的-我更喜欢过山车,如果线路正好是空的,就不会被拆除。Windows“不使用时删除”范例客观上排除了整个解决方案系列。我见过许多需要Windows语义的情况,但我从未遇到过一种可以使用POSIX(缺少)解决方案的情况。我还看到过太多的常用软件在我的系统中留下未使用的垃圾对象。