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