当进程被终止时丢弃打开的文件

3

有没有一种方法可以在C/C++应用程序中以一种方式写入打开Linux上的文件,以便如果应用程序被杀死,则打开的文件将被丢弃?

应用程序可能会被SIGKILL终止,因此无法使用信号处理程序。


您的意思是通过discarded将其从文件系统中删除吗? - Harald
很可能在进程本身内部无法实现。文件在被写入时是否已经有正确的名称并不重要。如果没有,可以用临时名称将它们写入。如果进程在 close() 之前生存下来,那么再给文件改名。如果进程被终止,你可以选择立即清理临时文件的方式:定期清理的 cron 任务,或者由父进程检测到子进程已经结束并进行清理。 - Harald
1个回答

1
典型的临时文件技巧是打开/创建一个文件,然后在不关闭文件描述符的情况下取消链接它。这样你就得到了一个指向不存在的文件的文件描述符。你仍然可以从中读取和写入数据,但是一旦你关闭文件描述符(或被杀死),文件就会被删除并释放其占用的空间。当然,如果你决定之后要保留该文件,那么这种方法就不适用了。

如果想要保留文件,难道不能使用 link("/proc/self/fd/n", "permanent-name"); 吗? - Ben Voigt
@BenVoigt 通常情况下,该链接会(非法地)跨越文件系统边界。这是一个特殊情况吗? - Jonas Schäfer
@Jonas:经过进一步的研究,显然不是这样的。 proc / ./fd 是特殊情况,它们是符号链接,在目标被删除时不会断裂。 但是link不足以重新链接目标。也许有其他功能可以实现? - Ben Voigt
@Jonas:实际上,那个问题已经给出了答案。使用带有AT_FDCWDAT_EMPTY_PATH标志的linkat函数。另请参阅http://comments.gmane.org/gmane.linux.file-systems/76553 - Ben Voigt
很遗憾,我在手册页中找不到任何支持材料。但是是的,在我发表评论之后才看到了答案! - Jonas Schäfer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接