C言語システムコール-statvfs

statvfsシステムコール

概要

statvfsはファイルシステム情報を取得します。

statvfsを利用することで、ディスクの空き容量を調べるなどが可能になります。


statvfsは情報を取得するファイルシステム中の任意のファイルまたはディレクトリをパス名で指定します。

ファイルディスクリプタを指定する場合にはfstatvfsシステムコールを利用します。


statvfsに関連するシステムコールとして、statfs及びfstatfsがあります。

LinuxではstatvfsがCライブラリであり、statfsを呼び出す実装となっています。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/statvfs.h>

/*!
 * @brief     ファイルシステムの状態一覧を表示する
 * @param[in] filepath  ファイルパス名
 * @return    0:success/-1:failure
 */
static int
list_filesystem_info(char *filepath)
{
    int rc = 0;
    struct statvfs buf = {0};

    rc = statvfs(filepath, &buf);
    if(rc < 0){
        printf("Error: statvfs() %s: %s\n", strerror(errno), filepath);
        return(-1);
    }

    printf("ブロックサイズ     : %lu(byte/block)\n", buf.f_bsize);
    printf("フラグメントサイズ : %lu(byte/block)\n", buf.f_frsize);
    printf("全ブロック数       : %lu(block)\n",
           (unsigned long)buf.f_blocks);
    printf("空きブロック数     : %lu(block)\n",
           (unsigned long)buf.f_bfree);
    printf("使用可能ブロック数 : %lu(block)\n",
           (unsigned long)buf.f_bavail);
    printf("iノード数          : %lu(node)\n",
           (unsigned long)buf.f_files);
    printf("未使用iノード数    : %lu(node)\n",
           (unsigned long)buf.f_ffree);
    printf("使用可能iノード数  : %lu(node)\n",
           (unsigned long)buf.f_favail);
    printf("ファイルシステムID : %lu\n", buf.f_fsid);
    printf("マウントフラグ     : %lu\n", buf.f_flag);
    printf("最大ファイル名長   : %lu(byte)\n", buf.f_namemax);
    printf("-------------------------------------\n");
    printf("available          : %4.0f(kbyte)\n",
           (float)buf.f_frsize * buf.f_bavail / 1024);
    printf("all                : %4.0f(kbyte)\n",
           (float)buf.f_frsize * buf.f_blocks / 1024);
    printf("free               : %4.1f%%\n",
           100 - ((float)buf.f_bfree / buf.f_blocks * 100));

    return(0);
}

int
main(int argc, char *argv[])
{
    int rc = 0;

    if(argc != 2){
        fprintf(stderr, "Usage: %s <path>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    rc = list_filesystem_info(argv[1]);
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}


関連ページ