You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用statvfs监控磁盘空间无变化但df显示占用,求排查问题

问题:statvfs监控磁盘空间无变化但df显示空间已占用

你编写的C++程序使用statvfs监控磁盘空间,写入文件后statvfs返回的可用块数未发生变化,但执行df命令能看到磁盘空间已被占用,问题出在以下几个地方:

错误点分析

  • statvfs传入路径错误:你传入的/dev/mapper/rhel-home是块设备文件路径,而statvfs需要的是文件系统的挂载点路径(比如/home)。statvfs用于查询挂载后的文件系统状态,直接传入设备文件无法获取正确的文件系统使用数据。
  • 变量名拼写错误:第二次调用statvfs时使用了未定义的变量buf,你实际定义的变量是buff,这会导致编译错误;后续输出时混用buf和buff,最终输出的仍是初始的buff值,自然看不到变化。
  • 文件写入路径不匹配:你创建的output.data在当前工作目录下,如果当前目录不在/home挂载点范围内,写入的内容根本没进入你监控的文件系统,statvfs当然检测不到空间变化。

修正后的代码

#include <iostream>
#include <sys/statvfs.h>
#include <fstream>
#include <vector>

int main()
{
   struct statvfs buff;
   // 修改为对应文件系统的挂载点路径
   const char* path = "/home";

   if (statvfs(path, &buff) != 0)
   {
      std::cout << "statvfs error\n";
      return 1;
   }

   std::cout << "Initial - Total blocks: " << buff.f_blocks<< "\n";
   std::cout << "Initial - Free blocks: "  << buff.f_bfree << "\n";
   
   const size_t GB = (1024 * 1024) * 1024;

   std::vector<char> data(GB, 'A');
   
   // 确保文件写入到监控的挂载点目录下
   std::ofstream file("/home/output.data", std::ios::binary);
   if (!file)
   {
      std::cout << "file open error\n";
      return 1;
   }

   for (int i = 0; i < 10; i++)
   {
      file.write(data.data(), GB);
      file.flush();

      std::cout  << "Wrote 1 GB to disk, iteration " << i + 1 << "\n";
   }

   file.close();
   std::cout << "Completed writing to disk\n";

   // 使用正确的变量名buff
   if (statvfs(path, &buff) != 0)
   {
      std::cout << "statvfs error\n";
      return 1;
   }
  
   std::cout << "Final - Total blocks: " << buff.f_blocks<< "\n";
   std::cout << "Final - Free blocks: "  << buff.f_bfree << "\n";
   
   return 0;
}

额外说明

  • 可以通过df -h /dev/mapper/rhel-home命令确认/dev/mapper/rhel-home对应的挂载点路径。
  • 运行程序时需确保拥有目标挂载点目录的写入权限。

内容的提问来源于stack exchange,提问作者Mr.Longbottom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:50:01