linux下获取磁盘空间大小statfs, fstatfs

在Linux环境一般可以通过df命令来获取磁盘空间大小,但是在编程过程中,命令方式不合适,这里我们通过Linux的API来获取空间大小,具体有两个函数statfs和fstafts,本篇记录这两个函数的基本用法。

statfs()系统调用返回有关已挂载文件系统的信息。path是装载的文件系统中任何文件的路径名。buf是一个指向statfs结构的指针,其定义大致如下:


struct statfs {
    __fsword_t f_type;    /* Type of filesystem (see below) */
    __fsword_t f_bsize;   /* Optimal transfer block size */
    fsblkcnt_t f_blocks;  /* Total data blocks in filesystem */
    fsblkcnt_t f_bfree;   /* Free blocks in filesystem */
    fsblkcnt_t f_bavail;  /* Free blocks available to unprivileged user */
    fsfilcnt_t f_files;   /* Total file nodes in filesystem */
    fsfilcnt_t f_ffree;   /* Free file nodes in filesystem */
    fsid_t     f_fsid;    /* Filesystem ID */
    __fsword_t f_namelen; /* Maximum length of filenames */
    __fsword_t f_frsize;  /* Fragment size (since Linux 2.6) */
    __fsword_t f_flags;   /* Mount flags of filesystem
                                    (since Linux 2.6.36) */
    __fsword_t f_spare[xxx];
        /* Padding bytes reserved for future use */
};
path: 需要查询信息的文件系统的文件路径名。
fd: 需要查询信息的文件系统的文件描述词。
buf:以下结构体的指针变量,用于储存文件系统相关的信息
struct statfs {
f_type; /* 文件系统类型 */
f_bsize; /* 经过优化的传输块大小,单位B*/
f_blocks; /* 文件系统数据块总数 */
f_bfree; /* 可用块数 */
f_bavail; /* 非超级用户可获取的块数 */
f_files; /* 文件结点总数 */
f_ffree; /* 可用文件结点数 */
f_fsid; /* 文件系统标识 */
f_namelen; /* 文件名的最大长度 */
};

1.statfs函数

函数名statfs
相关函数fstatfs
表头文件#include<sys/statfs.h>
函数定义int statfs(const char *path, struct statfs *buf);
函数说明获取已挂载的文件系统信息,获取成功文件系统信息保存在buf中
返回值正常返回0,错误非0

示例:

#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/statfs.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


using namespace std;


int main()
{
    struct statfs diskInfo1;
    statfs("/", &diskInfo1);
    unsigned long long blocksize1 = diskInfo1.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize1 = blocksize1 * diskInfo1.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk1 = diskInfo1.f_bfree * blocksize1; //剩余空间的大小
    unsigned long long availableDisk1 = diskInfo1.f_bavail * blocksize1; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize1, totalsize1>>10, totalsize1>>20, totalsize1>>30);
    printf("Disk_free1      = %llu MB \t= %llu GB\n", freeDisk1>>20, freeDisk1>>30);
    printf("Disk_available1 = %llu MB \t= %llu GB\n", availableDisk1>>20, availableDisk1>>30);

    printf("\n");
    struct statfs diskInfo2;
    statfs("/home", &diskInfo2);
    unsigned long long blocksize2 = diskInfo2.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize2 = blocksize2 * diskInfo2.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk2 = diskInfo2.f_bfree * blocksize2; //剩余空间的大小
    unsigned long long availableDisk2 = diskInfo2.f_bavail * blocksize2; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize2, totalsize2>>10, totalsize2>>20, totalsize2>>30);
    printf("Disk_free2      = %llu MB \t= %llu GB\n", freeDisk2>>20, freeDisk2>>30);
    printf("Disk_available2 = %llu MB \t= %llu GB\n", availableDisk2>>20, availableDisk2>>30);
    printf("\n");

    struct statfs diskInfo3;
    statfs("/home/scott", &diskInfo3);
    unsigned long long blocksize3 = diskInfo3.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize3 = blocksize3 * diskInfo3.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk3 = diskInfo3.f_bfree * blocksize3; //剩余空间的大小
    unsigned long long availableDisk3 = diskInfo3.f_bavail * blocksize3; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize3, totalsize3>>10, totalsize3>>20, totalsize3>>30);
    printf("Disk_free3      = %llu MB \t= %llu GB\n", freeDisk3>>20, freeDisk3>>30);
    printf("Disk_available3 = %llu MB \t= %llu GB\n", availableDisk3>>20, availableDisk3>>30);
    printf("\n");

    struct statfs diskInfo4;
    statfs("/home/scott/Videos", &diskInfo4);
    unsigned long long blocksize4 = diskInfo4.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize4 = blocksize4 * diskInfo4.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk4 = diskInfo4.f_bfree * blocksize4; //剩余空间的大小
    unsigned long long availableDisk4 = diskInfo4.f_bavail * blocksize4; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize4, totalsize4>>10, totalsize4>>20, totalsize4>>30);
    printf("Disk_free4      = %llu MB \t= %llu GB\n", freeDisk4>>20, freeDisk4>>30);
    printf("Disk_available4 = %llu MB \t= %llu GB\n", availableDisk4>>20, availableDisk4>>30);
    printf("\n");

    struct statfs diskInfo5;
    statfs("/media/sf_ubuntuShare", &diskInfo5);
    unsigned long long blocksize5 = diskInfo5.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize5 = blocksize5 * diskInfo5.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk5 = diskInfo3.f_bfree * blocksize5; //剩余空间的大小
    unsigned long long availableDisk5 = diskInfo5.f_bavail * blocksize5; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize5, totalsize5>>10, totalsize5>>20, totalsize5>>30);
    printf("Disk_free5      = %llu MB \t= %llu GB\n", freeDisk5>>20, freeDisk5>>30);
    printf("Disk_available5 = %llu MB \t= %llu GB\n", availableDisk5>>20, availableDisk5>>30);


    cout << "Hello World!" << endl;
    return 0;
}


运行结果:

由以上看出,/、/home、/home/scott、 /home/scott/Videos目录获取的磁盘大小是一样的,原因是这几个目录都在同一块磁盘上,/media/sf_ubuntuShare是另外挂载的磁盘,这个并知道目录是否存在,下面这个函数可以先获取该目录是否存在,存在再获取文件系统信息。

2.fstatfs函数

函数名fstatfs
相关函数statfs
表头文件#include<sys/statfs.h>
函数定义int statfs(int fd, struct statfs *buf);
函数说明获取已挂载的文件系统信息,获取成功文件系统信息保存在buf中
返回值

正常返回0,错误非0

示例:

#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/statfs.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


using namespace std;


int main()
{
    struct statfs diskInfo1;
    int fd1 = open("/", O_RDONLY);
    if(fd1 == -1) {
        perror("open /");
        return -1;
    }

    fd1 = fstatfs(fd1, &diskInfo1);
    if(fd1 == -1) {
        perror("fstatfs fd1");
        close(fd1);
        return -1;
    }
    unsigned long long blocksize1 = diskInfo1.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize1 = blocksize1 * diskInfo1.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk1 = diskInfo1.f_bfree * blocksize1; //剩余空间的大小
    unsigned long long availableDisk1 = diskInfo1.f_bavail * blocksize1; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize1, totalsize1>>10, totalsize1>>20, totalsize1>>30);
    printf("Disk_free1      = %llu MB \t= %llu GB\n", freeDisk1>>20, freeDisk1>>30);
    printf("Disk_available1 = %llu MB \t= %llu GB\n", availableDisk1>>20, availableDisk1>>30);
    printf("\n");

    struct statfs diskInfo2;
    int fd2 = open("/home", O_RDONLY);
    if(fd2 == -1) {
        perror("open /home");
        return -1;
    }

    fd2 = fstatfs(fd2, &diskInfo2);
    if(fd2 == -1) {
        perror("fstatfs fd2");
        close(fd2);
        return -1;
    }
    unsigned long long blocksize2 = diskInfo2.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize2 = blocksize2 * diskInfo2.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk2 = diskInfo2.f_bfree * blocksize2; //剩余空间的大小
    unsigned long long availableDisk2 = diskInfo2.f_bavail * blocksize2; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize2, totalsize2>>10, totalsize2>>20, totalsize2>>30);
    printf("Disk_free2      = %llu MB \t= %llu GB\n", freeDisk2>>20, freeDisk2>>30);
    printf("Disk_available2 = %llu MB \t= %llu GB\n", availableDisk2>>20, availableDisk2>>30);
    printf("\n");

    struct statfs diskInfo3;
    int fd3 = open("/home/scott", O_RDONLY);
    if(fd3 == -1) {
        perror("open /home/scott");
        return -1;
    }

    fd3 = fstatfs(fd3, &diskInfo3);
    if(fd3 == -1) {
        perror("fstatfs fd3");
        close(fd3);
        return -1;
    }
    unsigned long long blocksize3 = diskInfo3.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize3 = blocksize3 * diskInfo3.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk3 = diskInfo3.f_bfree * blocksize3; //剩余空间的大小
    unsigned long long availableDisk3 = diskInfo3.f_bavail * blocksize3; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize3, totalsize3>>10, totalsize3>>20, totalsize3>>30);
    printf("Disk_free3      = %llu MB \t= %llu GB\n", freeDisk3>>20, freeDisk3>>30);
    printf("Disk_available3 = %llu MB \t= %llu GB\n", availableDisk3>>20, availableDisk3>>30);
    printf("\n");

    struct statfs diskInfo4;
    int fd4 = open("/home/scott/Videos", O_RDONLY);
    if(fd4 == -1) {
        perror("open /home/scott/Videos");
        return -1;
    }

    fd4 = fstatfs(fd4, &diskInfo4);
    if(fd4 == -1) {
        perror("fstatfs fd4");
        close(fd4);
        return -1;
    }
    unsigned long long blocksize4 = diskInfo4.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize4 = blocksize4 * diskInfo4.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk4 = diskInfo4.f_bfree * blocksize4; //剩余空间的大小
    unsigned long long availableDisk4 = diskInfo4.f_bavail * blocksize4; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize4, totalsize4>>10, totalsize4>>20, totalsize4>>30);
    printf("Disk_free4      = %llu MB \t= %llu GB\n", freeDisk4>>20, freeDisk4>>30);
    printf("Disk_available4 = %llu MB \t= %llu GB\n", availableDisk4>>20, availableDisk4>>30);
    printf("\n");

    struct statfs diskInfo5;
    int fd5 = open("/media/sf_ubuntuShare", O_RDONLY);
    if(fd5 == -1) {
        perror("open /media/sf_ubuntuShare");
        return -1;
    }

    fd5 = fstatfs(fd5, &diskInfo5);
    if(fd5 == -1) {
        perror("fstatfs fd5");
        close(fd5);
        return -1;
    }

    unsigned long long blocksize5 = diskInfo5.f_bsize; //每个block里包含的字节数
    unsigned long long totalsize5 = blocksize5 * diskInfo5.f_blocks; //总的字节数,f_blocks为block的数目
    unsigned long long freeDisk5 = diskInfo3.f_bfree * blocksize5; //剩余空间的大小
    unsigned long long availableDisk5 = diskInfo5.f_bavail * blocksize5; //可用空间大小
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
           totalsize5, totalsize5>>10, totalsize5>>20, totalsize5>>30);
    printf("Disk_free5      = %llu MB \t= %llu GB\n", freeDisk5>>20, freeDisk5>>30);
    printf("Disk_available5 = %llu MB \t= %llu GB\n", availableDisk5>>20, availableDisk5>>30);


    cout << "Hello World!" << endl;
    return 0;
}




运行结果:

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识点解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“橙点同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值