【问题标题】:Linux create and remove file from always-on applicationLinux 从永远在线的应用程序中创建和删除文件
【发布时间】:2018-05-27 15:06:58
【问题描述】:

我正在 Linux 中编写一个始终在线的服务,该服务打开并写入 /tmp 中的文件,然后应该删除文件。
我看到 /tmp/ 在进程删除文件后没有释放空间,尽管文件本身不存在。当我执行 lsof 时,我看到此文件被标记为(已删除):
第1381章 /mnt/unlink /tmp/mest_elf

我读到要释放这个空间,我必须终止我的进程,但我不能,因为我需要它始终运行。

问题:
1. 我正在使用 posix remove()\unlink() 函数。还有其他功能可以完全删除文件吗?
2.有没有办法删除am lsof文件?
3. 对我还有什么建议吗? (记住我必须在c应用程序中编写)

谢谢。

【问题讨论】:

  • 简短的回答是“不”。在您的进程实际关闭文件之前,它将占用空间。 Linux 内核无法通过心灵感应确定您的进程是否会再次使用该文件,因此只要它处于打开状态,内核就必须假定该文件的内容必须随时可供您的程序使用,如果它选择read() 它。如果您想回收该磁盘空间,请close()您的文件。
  • 感谢您的回答。但是如果我使用ofstream呢?一般来说,我知道我不必明确关闭文件。如果我想删除文件,我应该先调用 close() 吗?
  • 你的理解有误。所有打开的文件都应该关闭。
  • 是的,这就是问题所在,我必须在调用删除之前关闭文件。谢谢!!

标签: c++ linux embedded-linux


【解决方案1】:

在 Linux(和其他 Unix 系统)中,只要任何进程具有引用该文件的打开文件描述符,文件就存在。您可以取消文件与文件系统的链接,使其不再可见,但如果该文件有打开的句柄(文件描述符),那么它仍然存在并且对于那些持有这些句柄的进程来说是一个有效的文件。

这很有用 - 您不会遇到无法删除打开文件的 Windows 问题。 但这也意味着文件占用的存储空间不会被释放,直到所有具有打开句柄的进程都关闭该句柄。

确保进程已关闭所有句柄的一种简单方法当然是终止进程。但是,一个进程也可以只是close()(或fclose() 和类似的;最终为close)它对文件的打开句柄并继续运行。

Linux/Unix 和 Windows 文件系统语义在这方面完全不同。您应该阅读具体的差异。

【讨论】:

  • ...别忘了检查返回的错误代码*close()
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2016-01-16
  • 2013-07-20
相关资源
最近更新 更多