我正在用Linux编写一个永远在线的服务,它打开/tmp中的文件并将其写入,然后应该删除文件。
我看到在进程删除文件之后,/tmp/并没有释放空间,尽管文件本身并不存在。当我执行lsof时,我看到这个文件被标记为(已删除):
1381 /mnt/unlink /tmp/mest_elf (已删除)
我读到,为了释放这个空间,我必须杀死我的进程,但我不能,因为我需要它总是运行。
问题:
谢谢。
发布于 2018-05-27 23:14:12
在Linux (和其他Unix系统)中,只要任何进程具有引用该文件的打开文件描述符,该文件就会存在。您可以取消该文件与文件系统的链接,使其不再可见,但是如果该文件有打开的句柄(文件描述符),那么它仍然存在,并且对于那些持有这些句柄的进程来说,它是一个有效的文件。
这很有用--您不会遇到Windows无法删除打开的文件的问题。但这也意味着,在具有打开句柄的所有进程关闭该句柄之前,不会释放该文件占用的存储空间。
当然,确保进程关闭所有句柄的一种简单方法是终止该进程。但是,进程也可以只close() (或fclose()和类似的;最终为close)它对文件的打开句柄并保持运行。
Linux/Unix和Windows文件系统的语义在这方面有很大的不同。你应该仔细阅读一下具体的区别。
https://stackoverflow.com/questions/50553516
复制相似问题