Linux statvfs()获取系统磁盘信息
获取磁盘信息方式
Linux中,可以在终端用df -h
,fdisk -l
等命令,查看磁盘信息,但C/C++程序中,如何查看呢?
可以使用statvfs, fstatvfs调用。
statvfs, fstatvfs 函数说明
有2个接口能获取磁盘信息方式,statvfs需要传入一个C风格Posix路径;fstatvfs需要一个打开的文件描述符。
#include <sys/statvfs.h>
int statvfs(const char *path, struct statvfs *buf);
int fstatvfs(int fd, struct statvfs *buf);
参数说明:
- path 要获取磁盘信息的路径,只要是挂载到操作文件系统的路径即可。
- fd 是已打开文件描述符,代表要获取磁盘信息的文件。
- buf 指向一个statvfs结构,定义如下:
struct statvfs {
unsigned long f_bsize; /* Filesystem block size 文件系统块大小 */
unsigned long f_frsize; /* Fragment size 碎片大小 */
fsblkcnt_t f_blocks; /* Size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* Number of free blocks 空闲块数量 */
fsblkcnt_t f_bavail; /* Number of free blocks for
unprivileged users 非特权用户的空闲块数量 */
fsfilcnt_t f_files; /* Number of inodes i节点数量 */
fsfilcnt_t f_ffree; /* Number of free inodes 空闲i节点数量 */
fsfilcnt_t f_favail; /* Number of free inodes for
unprivileged users 非特权用户的空闲i节点数量 */
unsigned long f_fsid; /* Filesystem ID 文件系统id */
unsigned long f_flag; /* Mount flags 挂载标识 */
unsigned long f_namemax; /* Maximum filename length 最大文件名长度 */
};
f_flag是bit位掩码的,表示当挂载到该文件系统时的各种选项。包含以下几个选项:
- ST_MANDLOCK 文件系统上允许强制锁。
- ST_NOATIME 不更新访问时间。
- ST_NODEV 不允许访问设备特殊文件。
- ST_NODIRATIME 不更新目录访问时间。
- ST_NOEXEC 不允许找文件系统上执行程序。
- ST_NOSUID 对于文件系统上的可执行文件,exec加载器忽略set-user-ID 和 set-group-ID bit位。
- ST_RDONLY 文件系统挂载为只读。
- ST_RELATIME 更新访问时间,参考mtime/ctime。
- ST_SYNCHRONOUS 写立即同步到文件系统,参见open的O_SYNC选项。
返回值:
成功返回0;失败返回-1,errno被设置。
示例:求磁盘剩余空间
假设现在我们想得到磁盘剩余空间,该如何获取?
前面提到,可以通过statvfs得到磁盘的空闲块数量(f_bfree),以及每个空闲块大小(f_bsize)。
#include <cstdio>
#include <sys/statvfs.h>
#include <cerrno>
#include <cstring>
using namespace std;
int printFreeSpace(const char *path)
{
struct statvfs st;
if (::statvfs(path, &st) != 0) {
printf("statvfs error: %s\n", strerror(errno));
return -1;
}
auto freeSize = st.f_bsize * st.f_bfree;
printf("current free space of path %s: %lu byte\n", path, freeSize);
return 0;
}
int main()
{
printFreeSpace("/");
return 0;
}
在我的电脑上运行结果:
current free space of path /: 125865598976 byte
125865598976 byte约117GB,跟实际情况相符。