使用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
相关产品推荐
相关产品推荐

