statfs函数说明

函数:
    statfs

功能描述:
    查询文件系统相关的信息。

用法:
    #include <sys/vfs.h> /* 或者 <sys/statfs.h> */

int statfs(const char *path, struct statfs *buf);

int fstatfs(int fd, struct statfs *buf);

参数:
    path: 需要查询信息的文件系统的文件路径名。

fd: 需要查询信息的文件系统的文件描述词

buf:以下结构体指针变量,用于储存文件系统相关的信息

struct statfs {

long f_type; /* 文件系统类型 */

long f_bsize; /* 经过优化的传输块大小 */

long f_blocks; /* 文件系统数据块总数 */

long f_bfree; /* 可用块数 */

long f_bavail; /* 非超级用户可获取的块数 */

long f_files; /* 文件结点总数 */

long f_ffree; /* 可用文件结点数 */

fsid_t f_fsid; /* 文件系统标识 */

long f_namelen; /* 文件名的最大长度 */

};

返回说明:
    成功执行时,返回0。失败返回-1,errno被设为以下的某个值

EACCES: (statfs())文件或路径名中包含的目录不可访问

EBADF : (fstatfs()) 文件描述词无效

EFAULT: 内存地址无效

EINTR : 操作由信号中断

EIO : 读写出错

ELOOP : (statfs())解释路径名过程中存在太多的符号连接

ENAMETOOLONG:(statfs()) 路径名太长

ENOENT:(statfs()) 文件不存在

ENOMEM: 核心内存不足

ENOSYS: 文件系统不支持调用

ENOTDIR:(statfs())路径名中当作目录的组件并非目录

EOVERFLOW:信息溢出

例子:

  1 //说明:pDisk 路径名 如“/home”
  2
  3 int DH_GetDiskfreeSpacePercent(char *pDisk){
  4     long long freespace = 0;
  5     struct statfs disk_statfs;
  6     long long totalspace = 0;
  7     float freeSpacePercent = 0 ;
  8
  9     if( statfs(pDisk, &disk_statfs) >= 0 ){
 10         freespace = (((long long)disk_statfs.f_bsize * (long long)disk_statfs.f_bfree)/(long long)1024);
 11         totalspace = (((long long)disk_statfs.f_bsize * (long long)disk_statfs.f_blocks) /(long long)1024);
 12     }
 13
 14     freeSpacePercent = ((float)freespace/(float)totalspace)*100 ;
 15     return freeSpacePercent ;
 16 }
 17
 18 linux df命令实现:
 19
 20 #include <stdio.h>
 21 #include <stdlib.h>
 22 #include <string.h>
 23 #include <errno.h>
 24 #include <sys/statfs.h>
 25
 26 static int ok = EXIT_SUCCESS;
 27
 28 static void printsize(long long n)
 29 {
 30     char unit = ‘K‘;
 31     n /= 1024;
 32     if (n > 1024) {
 33        n /= 1024;
 34        unit = ‘M‘;
 35     }
 36     if (n > 1024) {
 37        n /= 1024;
 38        unit = ‘G‘;
 39     }
 40     printf("%4lld%c", n, unit);
 41 }
 42
 43 static void df(char *s, int always) {
 44     struct statfs st;
 45
 46     if (statfs(s, &st) < 0) {
 47         fprintf(stderr, "%s: %s\n", s, strerror(errno));
 48         ok = EXIT_FAILURE;
 49     } else {
 50         if (st.f_blocks == 0 && !always)
 51            return;
 52         printf("%-20s ", s);
 53         printf("%-20s ", s);
 54         printsize((long long)st.f_blocks * (long long)st.f_bsize);
 55         printf(" ");
 56         printsize((long long)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize);
 57         printf(" ");
 58         printsize((long long)st.f_bfree * (long long)st.f_bsize);
 59         printf(" %d\n", (int) st.f_bsize);
 60     }
 61 }
 62
 63 int main(int argc, char *argv[]) {
 64     printf("Filesystem Size Used Free Blksize\n");
 65     if (argc == 1) {
 66         char s[2000];
 67         FILE *f = fopen("/proc/mounts", "r");
 68
 69         while (fgets(s, 2000, f)) {
 70             char *c, *e = s;
 71
 72             for (c = s; *c; c++) {
 73                 if (*c == ‘ ‘) {
 74                     e = c + 1;
 75                     break;
 76                 }
 77             }
 78
 79             for (c = e; *c; c++) {
 80                 if (*c == ‘ ‘) {
 81                     *c = ‘\0‘;
 82                     break;
 83                 }
 84             }
 85
 86             df(e, 0);
 87         }
 88
 89         fclose(f);
 90     } else {
 91         printf(" NO argv\n");
 92         int i;
 93
 94         for (i = 1; i < argc; i++) {
 95             df(argv[i], 1);
 96         }
 97     }
 98
 99     exit(ok);
100 }

statfs函数说明

时间: 2024-10-29 19:09:40

statfs函数说明的相关文章

[文件系统]文件系统学习笔记(十)---杂项

1,在一个系统上,比如smartphone平台,有很多分区,比如/data和/system分区都是ext4文件系统,但是系统中还是只有一个file_system_type的成员,不过每个分区对应的ext4文件系统对应不同的super_block,fs_supers就是将这些相同文件系统不同的super block链接起来形成双向循环链表,fs_supers是链表头,链表元素由super_block结构体的s_instance成员表示.系统中所有的super_block由super_block结构

C/C++ 获取文件大小

面试的时候面试官提到了怎样获取文件的大小,现在总结如下: 在C语言中测试文件的大小,主要使用二个标准函数. 1.fseek 函数原型:int fseek ( FILE * stream, long int offset, int origin ); 参数说明:stream,文件流指针:offest,偏移量:orgin,原(始位置.其中orgin的可选值有SEEK_SET(文件开始).SEEK_CUR(文件指针当前位置).SEEK_END(文件结尾). 函数说明:对于二进制模式打开的流,新的流位置

添砖加瓦:Linux系统监测

前言 前段时间因为项目需求,需要实时获取系统当前的运行状态,遂查阅了不少资料,基于/proc目录下的部分文件,实现了系统CPU.内存.网络和磁盘的实时监测. 一.CPU使用情况获取 获取CPU使用情况是从/proc/stat文件中获取的,/proc/stat 包含了系统启动以来的许多关于kernel和系统的统计信息,其中包括CPU运行情况.中断统计.启动时间.上下文切换次数.运行中的进程等等信息 cpu 1149770 0 309685 239871041 7 0 0 0 cpu0 114977

stat 函数讲解

表头文件:    #include <sys/stat.h>                     #include <unistd.h>定义函数:    int stat(const char *file_name, struct stat *buf); 函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值:     执行成功则返回0,失败返回-1,错误代码存于errno错误代码:    ENOENT         参数file

Linux操作系统中的系统调用接口函数

在分析病毒样本时发现有些系统函数是必用,有些超常用,现在都列出来,希望和大家交流 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识号 setpgid 设置指定进程组标志号 getpgrp 获取当前进程组

stat函数讲解

表头文件:    #include <sys/stat.h>             #include <unistd.h>定义函数:    int stat(const char *file_name, struct stat *buf);函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值:      执行成功则返回0,失败返回-1,错误代码存于errno 错误代码:    ENOENT         参数file_name指定

【转】linux C++ 获取文件信息 stat函数详解

stat函数讲解 表头文件:    #include <sys/stat.h>             #include <unistd.h>定义函数:    int stat(const char *file_name, struct stat *buf);函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值:      执行成功则返回0,失败返回-1,错误代码存于errno 错误代码:    ENOENT         参数fi

Linux 系统调用函数

转载: 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的. 按照惯例,这个列表以man pages第2节,即系统调用节为蓝本.按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对个别本人稍觉不妥的地方作了一些小的修改,并对所有列出的系统调用附上简要注释. 其中有一些函数的

linux stat函数详解

linux stat函数详解 表头文件: #include <sys/stat.h> #include <unistd.h> 定义函数: int stat(const char *file_name, struct stat *buf); 函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中 返回值: 执行成功则返回0,失败返回-1,错误代码存于errno 错误代码: ENOENT 参数file_name指定的文件不存在 ENOTDIR 路径中的