【发布时间】:2010-10-03 01:11:02
【问题描述】:
Win32 的 CreateFile 有 FILE_FLAG_DELETE_ON_CLOSE,但我在 Linux 上。
我想打开一个临时文件,该文件将在程序终止时被删除。我可以理解,在程序崩溃的情况下,保证这一点可能不切实际,但在任何其他情况下,我希望它能够工作。
我知道 RAII。我知道信号。我知道atexit(3)。我知道我可以打开文件并立即删除它,并且文件将保持可访问状态,直到文件描述符关闭(甚至可以处理崩溃)。这些似乎都不是一个完整而直接的解决方案:
- RAII:去过那里,做到了:我有一个对象,其析构函数会删除文件,但如果程序被信号终止,则不会调用析构函数。
- 信号:我正在编写一个低级库,这使得注册信号处理程序成为一个棘手的提议。例如,如果应用程序本身使用信号怎么办?我不想踩到任何脚趾头。我可能会考虑巧妙地使用
sigaction(2)来应对……但还没有充分考虑这种可能性。 -
atexit(3):显然没用,因为在异常终止期间(例如通过信号)不会调用它。 - 抢占式
unlink(2):这很好,只是我需要文件在文件系统中保持可见(否则系统更难监控/排除故障)。
你会在这里做什么?
进一步说明
我在原始帖子中省略了一个细节,现在我意识到我应该包括在内。在这种情况下,“文件”并不是严格意义上的普通文件,而是一个 POSIX 消息队列。我通过mq_open() 创建它。它可以通过mq_close() 或close() 关闭(前者是我系统上后者的别名)。可以通过mq_unlink() 将其从系统中删除。所有这些都使它类似于常规文件,除了我无法选择文件所在的目录。这使得当前最流行的答案(将文件放在/tmp)不可行,因为“文件”是由系统在容量非常有限的虚拟文件系统中创建的。 (我已经按照man mq_overview 中的示例将虚拟文件系统安装在/dev/mqueue 中)。
这也解释了为什么我需要名称保持可见(使立即取消链接方法不可行):“文件”必须在两个或多个进程之间共享。
【问题讨论】:
-
第 4 项(保持名称易于访问)使其变得困难。
-
每次遗漏一个重要的细节,答案就会出错。下次你就知道了。
标签: c++ c file termination unlink