RAII和系统资源清理

时间:2011-07-13 03:57:21

标签: resources system raii

RAII是资源清理的好方法。但是,RAII基于堆栈展开。如果进程异常终止,则堆栈将不会被取消。这意味着RAII在这种情况下不起作用。对于进程生命周期的资源,没什么好担心的,但是对于文件系统生命中的tiem或kernal生命周期资源,比如文件,消息队列,信号量,共享内存,这将是一个问题。

如何以可靠的方式清理系统(fs和kernal)资源?

实施例: 共享文件将由“主”进程创建,并由“从”进程使用。应该通过计划中的“主”进程删除共享文件。是否存在这样做的方法。

很明显,共享文件创建后不能立即取消链接。如果是这样,其他进程就无法“看到”该文件。

1 个答案:

答案 0 :(得分:1)

你的问题没有完美的答案。你大多只是尽可能地减轻这种影响,所以“异常终止让垃圾落后”很少见。

首先,编写程序以尽可能强大地防止异常进程终止。

其次,尽可能依赖内核机制。在您的共享文件示例中,如果您只是在谈论使用文件进行通信的一个“主”和一个“从”进程,那么只要两个进程都打开它,您就可以取消链接该文件。该文件将继续存在并且可由两个进程读写,直到它们都关闭它,此时内核将自动回收存储。 (即使它们都异常终止。)

当然,下次你的服务器启动时,它可以清理上一次运行留下的任何垃圾,假设一次只能存在一个。

通常的最后机会机制是让“清理”过程定期运行(例如)扫出/ tmp。

但你要问的是根本难的。任何负责处理另一个异常终止的进程本身可能会异常终止。 “谁看着观察者?”