【问题标题】:Discard open files when process is killed进程被杀死时丢弃打开的文件
【发布时间】:2014-01-26 13:20:26
【问题描述】:

有没有办法在 Linux 上的 C/C++ 应用程序中写入打开的文件,如果应用程序被杀死,打开的文件将被丢弃?

应用程序可以被 SIGKILL 杀死,所以我不能使用信号处理程序。

【问题讨论】:

  • 丢弃的意思是从文件系统中删除(删除)?
  • 可能不在进程本身内。写入时文件已经具有正确的名称是否重要。如果没有,您可以使用临时名称编写它们。如果该进程在close() 之前一直存在,请重命名该文件。如果进程被杀死,您如何摆脱临时文件取决于您想要执行它的紧急程度:定期清理 cron,父进程注意到子进程已死并在其之后进行清理。

标签: linux file-io filehandle


【解决方案1】:

临时文件的典型技巧是打开/创建一个文件,然后在不关闭文件描述符的情况下取消链接。

您最终会得到一个文件描述符,该文件描述符不再存在。您仍然可以对其进行读取和写入,但是一旦您关闭文件描述符(或被杀死),该文件将被删除并释放它所占用的空间。

当然,如果您决定以后要保留该文件,这实际上是行不通的。

【讨论】:

  • 如果想保留文件,就不能使用link("/proc/self/fd/n", "permanent-name");吗?
  • @BenVoigt 通常,该链接将(非法)跨越文件系统边界。这是特例吗?
  • @Jonas:经过进一步研究,显然不是。 proc/./fd 是特殊情况,它们是在删除目标时不会中断的符号链接。但是link 不够聪明,无法重新链接目标。也许还有其他功能?
  • @Jonas:实际上,这个问题给出了答案。 linkat 带有 AT_FDCWDAT_EMPTY_PATH 标志。另见comments.gmane.org/gmane.linux.file-systems/76553
  • 很遗憾,我在联机帮助页中找不到任何支持材料。但是是的,我在这里发表评论后才看到答案!
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2010-12-02
  • 2015-08-30
相关资源
最近更新 更多