Linux statvfs()获取系统磁盘信息

获取磁盘信息方式

Linux中,可以在终端用df -hfdisk -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,跟实际情况相符。

posted @ 2023-03-13 19:43  明明1109  阅读(3244)  评论(0编辑  收藏  举报