Tag: unlink

程序终止时保证文件删除(C / C ++)

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