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
中)。
这也解释了为什么需要名称保持可见(使即时取消链接方法无法使用):必须在两个或多个进程之间共享“文件”。