如何通知其他进程文件已标记为删除?

时间:2013-02-01 12:52:26

标签: c++ c linux

我目前正在为嵌入式系统(有限的磁盘空间)编写 C 应用程序 在这个系统上,有几个进程访问我必须在某些事件中使用我的应用程序删除的文件(例如磁盘空间不足)。但由于其他进程仍然可以写入这些文件,因此磁盘空间情况不会改善。

是否有可能实际删除该文件并让其他进程的写访问失败?

我只能有限地访问其他进程的行为,所以如果不需要这些进程的合作就会很好。

2 个答案:

答案 0 :(得分:4)

有两个想法可以解决这样一个事实:在关闭文件的所有引用都关闭之前,文件实际上不会被删除:

  1. 如果可能或在您的情况下允许,请取消链接这些文件,然后重新启动其他进程。
  2. 截断/清空这些文件而不删除它们。

答案 1 :(得分:-1)

如果我是“其他进程”的所有者,则只要它们的大小达到给定的阈值,就让它们关闭,重命名并重新打开日志文件。这样可以以“标准”方式执行日志轮换(例如:logrotate

但是,似乎您已经有一些 legacy 应用程序。

在这种情况下,我建议在启动 legacy 应用程序之前,使用mkfifo创建命名管道来代替日志文件。

您的 C 应用程序将从这些特殊文件中读取数据,例如,这样便可以创建不超过指定数量的日志文件。这样,您便可以使用 logrotate

缺点:如果您的 C 应用程序未运行,则 legacy 应用程序将停留在write()系统调用中,尝试写入未连接的管道。