文件删除(使用取消链接)与释放所有磁盘空间之间的延迟

The delay between a file delete (using unlink) and all the disk space being freed

本文关键字:磁盘 空间 之间 延迟 释放 删除 取消 链接 文件      更新时间:2023-10-16

我正在通过取消链接并关闭文件句柄然后检查可用磁盘空间来删除临时文件。 如果我在关闭句柄后立即检查磁盘空间,则不会释放空间。

...
//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//中获得一个附加链接。