首页 > 系统相关 >Linux statvfs()获取系统磁盘信息

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

时间:2023-03-13 19:57:13浏览次数:51  
标签:statvfs Linux 文件系统 free ST path 磁盘

目录

获取磁盘信息方式

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,跟实际情况相符。

标签:statvfs,Linux,文件系统,free,ST,path,磁盘
From: https://www.cnblogs.com/fortunely/p/17212612.html

相关文章

  • linux部署jenkins
    linux部署jenkins参考:https://blog.csdn.net/liu_chen_yang/article/details/127202910参考:https://blog.csdn.net/zy10151/article/details/126875108相关依赖......
  • 在linux下使用sqlite3
    前言SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎(来源百度百科)。它是一款轻量级数据库,所占资源低,消耗总量小,被用于嵌入式开......
  • Linux系统编程与网络编程
    Linux系统编程Chapter1系统编程入门GCC区别GCC与G++gcc既能编译c,也能编译c++。只不过gcc在链接的时候,不能自动链接C++的库。在编译阶段,g++会调用gcc,二者是等价的......
  • Linux修改时间和时区
    Linux修改时间和时区一、查看时区1、方式一timedatectl如下图可见,系统时区为CST 2、方式二ll/etc/localtime 二、修改时区1、方法一1)查看可选时区tim......
  • Linux 命令行使用if语句进行判断
    说明:可以配合ansible进行批量实现例1:判断ntp是否启动systemctlis-activentpd.service&>/dev/null;if[$?==0];thenecho"ntp-ok";elseecho"ntp-no"|x......
  • linux ssh配置文件配置参数
    目录linuxssh配置文件配置参数HostKeyMaxAuthTriesNumberOfPasswordPromptslinuxssh配置文件配置参数HostKey/etc/ssh/ssh_host_rsa_keyHostKey/etc/ssh/ssh_host_e......
  • 5.docker容器磁盘不够
    引言docker所在服务器,在运行了一段时间后,服务器磁盘目录渐渐不够用。 通过du-h--max-depth=1/ 逐级目录排查,发现/var/lib/docker目录文件过大。 解决方法转移......
  • Linux-等保加固-记录用户的登录和操作日志
    通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查修改/etc/profile配置文件,在配置文件中新增以下内容 vi/etc/profileihistoryUSER=`whoam......
  • linux安装tomcat
    linux安装tomcat一、下载安装包链接:https://pan.baidu.com/s/1TibyDHGbwc3YIEX0ZDJ8jg提取码:183q需要用到其他版本的tomcat,请自行下载:下载地址:http://tom......
  • Linux操作系统file命令 – 识别文件类型
    前言file命令用来识别文件类型,也可用来辨别一些文件的编码格式。(是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的)语法file[参数]......