文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
The delay between a file delete (using unlink) and all the disk space being freed
我正在通过取消链接并关闭文件句柄然后检查可用磁盘空间来删除临时文件。 如果我在关闭句柄后立即检查磁盘空间,则不会释放空间。
...
//creating a temp file
int tempfile = open (filename, O_CREAT | O_RDWR | O_TRUNC, 0666);
unlink (filename);
//writing to temp file and reading from it
...
//Now we need to free disk space to make room for additional file writing.
//We no longer need the temp data in the file so we delete it.
statvfs(localDir,&sbuf1);
close(tempfile);
statvfs(localDir,&sbuf2);
//sbuf1.f_bavail == sbuf2.f_bavail
//I'd like to know HERE how much disk space I have for additional files,
//but I cannot really know since disk space is not freed yet.
如果我添加一个延迟(sleep(10((,我可以看到空间正在释放。
...
statvfs(localDir,&sbuf1);
close(tempfile);
sleep(10);
statvfs(localDir,&sbuf2);
//sbuf1.f_bavail < sbuf2.f_bavail
我无法找到有关删除和释放的所有磁盘空间之间的此延迟的信息。
等待任意秒数是浪费且不安全的(对于某些文件大小,我的延迟可能不够(。
是否有等到磁盘空间有效释放的阻塞功能,或者某种可以完成类似工作的机制?
谢谢
鉴于您提供的信息,我猜您在某处打开了文件。仅当您关闭它时,它才会被删除。无需打开文件即可取消链接。只需使用关闭文件的路径名调用unlink
即可。
编辑:打开文件会创建指向该文件的链接。因此,当文件打开时,您有 2 个链接:1 个来自文件系统,1 个来自您的程序(您可以在/proc//中看到链接(当您取消链接文件时,您会释放 1 个指向它的链接,但第二个链接仍然存在,直到 fd 关闭或进程终止(也, 如果从进程中分叉,该文件将在/proc//中获得一个附加链接。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 为什么QT的iOS组件会占用这么多磁盘空间?
- boost :: filesystem :: space()报告错误的磁盘空间
- C 的空间indexex库:从/到磁盘加载/存储主内存rtree
- 当提升内存映射文件分配的磁盘空间超过HDD上的可用空间时,如何检测错误
- 如何使用boost或poco获得(已用/可用/总)磁盘空间
- Qt是否提供了一种获取空闲磁盘空间的方法?
- 如何在C/C++中使用stdio文件操作时检测磁盘空间不足