【问题标题】:How to inform other processes that a file has marked for deletion?如何通知其他进程文件已标记为删除?
【发布时间】:2013-02-01 12:52:25
【问题描述】:

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

有没有可能实际删除文件,让其他进程的写访问失败?

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

【问题讨论】:

  • 解决方案有多难?我可以想象 ptracing 这些进程并关闭这些文件的 fds...
  • @PlasmaHH 可以这样说:我更喜欢简短而简单的解决方案,但文件必须删除,如果这些漂亮的小进程不想放弃对文件的控制,我必须强迫他们。
  • @Joze 保护文件是行不通的,因为这需要 linux 系统上其他进程的大量合作,我不知道我是否得到这个。
  • 你能重新启动那些进程吗?
  • 其他类 Unix 系统对此有一个称为 revoke 的系统调用。不幸的是,Linux 似乎无法做到这一点(glibc 中的存根只返回ENOSYS)。

标签: c++ c linux


【解决方案1】:

我想到了两个想法来解决这个事实,即在关闭所有对它的引用之前,文件实际上并没有被删除:

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

【讨论】:

  • 截断是解决方案。 +1
  • 感谢您的回答,截断在第一个视图中看起来很棒,进程仍然可以毫无问题地写入其打开的文件,但由于文件指针没有改变,其他进程似乎继续写入哪里他们停了下来。这导致文件不小于以前但带有前导零。
【解决方案2】:

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

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

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

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

缺点:如果您的 C 应用程序没有运行,旧版 应用程序将停留在 write() 系统调用中,试图写入一个 non -连接管道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2014-05-24
    • 2015-08-12
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多