RAII 是资源清理的一个很好的解决方案。然而,RAII 基于堆栈展开。如果进程异常终止,堆栈将不会被展开。这意味着 RAII 在这种情况下不起作用。对于进程生命周期的资源来说,这没什么好担心的,但是对于文件系统生命周期或者内核生命周期的资源,比如文件、消息队列、信号量、共享内存,这就会是一个问题。
如何以可靠的方式清理系统(文件系统和内核)资源?
例子:
共享文件将由“主”进程创建,并由“从”进程使用。共享文件应由计划中的“主”进程删除。是否存在一种方法可以做到这一点。
显然,共享文件创建后无法立即取消链接。如果是这样,其他进程将无法“查看”该文件。
你的问题没有完美的答案。您大多只是尽最大努力减轻影响,因此“异常终止留下垃圾”的情况很少见。
首先,编写尽可能健壮的程序以防止进程异常终止。
其次,尽可能依赖内核机制。在共享文件示例中,如果您只是谈论一个“主”进程和一个“从”进程使用文件进行通信,那么您可以在两个进程打开文件后立即取消链接该文件。该文件将继续存在并可供两个进程读写,直到两个进程都将其关闭,此时内核将自动回收存储。 (即使它们都异常终止。)
当然,下次服务器启动时,它可以清理上一次运行留下的任何垃圾,假设一次只存在一个垃圾。
通常的最后机会机制是让“清理”进程定期运行以(例如)清除 /tmp。
但你所问的问题从根本上来说是很难的。任何负责处理另一个异常终止的进程本身都可能异常终止。 “谁监视观察者?”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)