Linux 从永远在线的应用程序中创建和删除文件
Linux create and remove file from always-on application
我在 Linux 中编写一个始终在线的服务,该服务在/tmp 中打开并写入文件,然后应该删除文件。
我看到在进程删除文件后没有从/tmp/释放空间,尽管文件本身不存在。当我做lsof时,我看到这个文件被标记为(已删除(:
1381/mnt/unlink/tmp/mest_elf(已删除(
我读到我为了释放这个空间,我必须杀死我的进程,但我不能,因为我需要它始终运行。
问题:
1. 我正在使用 posix remove((\unlink(( 函数。 还有其他功能可以完全删除文件吗?
2.有没有办法删除我的LSOF文件?
3. 对我还有其他建议吗?(记住我必须用c应用程序编写它(
谢谢。
在 Linux(和其他 Unix 系统(中,只要任何进程都有一个引用该文件的打开文件描述符,文件就存在。您可以取消文件与文件系统的链接,使其不再可见,但如果该文件有打开的句柄(文件描述符(,那么它仍然会保留,并且对于持有这些句柄的进程来说是一个有效的文件。
这很有用 - 您没有无法删除打开文件的 Windows 问题。 但这也意味着,在具有打开句柄的所有进程关闭该句柄之前,不会释放文件占用的存储空间。
当然,确保进程已关闭所有句柄的一种简单方法是终止进程。但是,一个进程也可以只是close()
(或fclose()
和类似;最终close
(它对文件的打开句柄并继续运行。
Linux/Unix和Windows文件系统语义在这方面有很大的不同。您应该阅读具体的差异。
相关文章:
- 是否删除在对象构造过程中创建的对象
- 检测win32服务创建和删除的最佳方法
- 如何使用 C 指针的自定义删除器创建unique_ptr?
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 创建模板类型而不新建/删除
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- 删除使用 new 创建的 2D 或 3D 指针
- C++ 线程创建/删除与线程停止/恢复
- 如何使用 vtkImageImport 创建 vtkImageData,该导入在 vtkImageImport 删除后仍
- 工厂方法创建的对象应该在哪里删除?
- 在 QLayout 中创建和删除自定义 QWidgets 时出现 RAM 问题
- 从文件中读取多行.txt字符串删除空格并创建新文件进行输出
- Linux 从永远在线的应用程序中创建和删除文件
- 从主函数中删除在另一个函数中使用 new 创建的一系列对象
- 如何创建删除 C 字符串中所有选定字符的函数
- 使用 c++ 创建/删除文件夹
- 文件创建/删除效率
- Windows 7操作系统下创建/删除新用户
- 以编程方式为任务调度程序创建/删除任务