首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAII和系统资源清理

RAII和系统资源清理
EN

Stack Overflow用户
提问于 2011-07-13 11:57:21
回答 1查看 204关注 0票数 2

RAII是一个很好的资源清理解决方案。然而,RAII基于堆栈展开。如果进程异常终止,堆栈将不会展开。这意味着RAII在这种情况下不能工作。对于进程生命周期的资源来说,这没什么好担心的,但是对于文件系统的生命周期或者内核的生命周期资源,比如文件、消息队列、信号量、共享内存来说,这就是一个问题。

如何可靠地清理系统(文件系统和内核)资源?

示例:共享文件将由主进程创建,并由从进程使用。共享文件应由计划中的主进程删除。有没有办法做到这一点。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-13 13:17:04

你的问题没有完美的答案。你通常只是尽可能地减轻影响,所以“异常终止留下垃圾”是很少见的。

首先,编写尽可能健壮的程序,以防止异常进程终止。

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

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

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

但是你所问的从根本上来说是困难的。任何负责处理其他进程的异常终止的进程本身都可能异常终止。“谁在监视观察者?”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6673899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档