RAII是一个很好的资源清理解决方案。然而,RAII基于堆栈展开。如果进程异常终止,堆栈将不会展开。这意味着RAII在这种情况下不能工作。对于进程生命周期的资源来说,这没什么好担心的,但是对于文件系统的生命周期或者内核的生命周期资源,比如文件、消息队列、信号量、共享内存来说,这就是一个问题。
如何可靠地清理系统(文件系统和内核)资源?
示例:共享文件将由主进程创建,并由从进程使用。共享文件应由计划中的主进程删除。有没有办法做到这一点。
显然,共享文件不能在创建后立即解除链接。如果是这样,其他进程就无法“看到”该文件。
发布于 2011-07-13 13:17:04
你的问题没有完美的答案。你通常只是尽可能地减轻影响,所以“异常终止留下垃圾”是很少见的。
首先,编写尽可能健壮的程序,以防止异常进程终止。
其次,在可能的情况下依赖内核机制。在您的共享文件示例中,如果您只讨论一个“主”进程和一个“从”进程使用一个文件进行通信,那么您可以在两个进程都打开该文件后立即将其取消链接。该文件将继续存在,并且对两个进程都是可读和可写的,直到两个进程都关闭它,此时内核将自动回收存储空间。(即使它们都异常终止。)
当然,下次服务器启动时,它可以清除上一次运行留下的任何垃圾文件,假设一次只存在一个垃圾文件。
通常的最后机会机制是让“清理”进程定期运行以(例如)扫除/tmp。
但是你所问的从根本上来说是困难的。任何负责处理其他进程的异常终止的进程本身都可能异常终止。“谁在监视观察者?”
https://stackoverflow.com/questions/6673899
复制相似问题