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

statシステムコール

概要

statはファイルやディレクトリの状態を取得します。


指定ファイルがシンボリックリンクである場合、statはリンク先を辿って実体ファイルの情報を取得します。

シンボリックリンク自体の情報を取得する場合にはlstatなどを使用します。

fstatは、ファイルディスクリプタで対象ファイルを指定します。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>

/*!
 * @brief     ファイル情報を表示する
 * @param[in] filepath  ファイルパス名
 * @return    0:success/-1:failure
 */
static int
show_file_info(char *filepath)
{
    int rc = 0;
    struct stat sb = {0};

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

    printf("ファイル名 : %s\n", filepath);
    printf("デバイスID : %d\n", (int)sb.st_dev);
    printf("inode番号  : %d\n", (int)sb.st_ino);
    printf("パーミッション : %o\n", (int)sb.st_mode);
    printf("ハードリンク数 : %d\n", (int)sb.st_nlink);
    printf("所有者のユーザID   : %d\n", (int)sb.st_uid);
    printf("所有者のグループID : %d\n", (int)sb.st_gid);
    printf("デバイスID(特殊ファイルの場合) : %d\n", (int)sb.st_rdev);
    printf("容量(バイト単位)               : %d\n", (int)sb.st_size);
    printf("ファイルシステムのブロックサイズ : %d\n", (int)sb.st_blksize);
    printf("割り当てられたブロック数         : %d\n", (int)sb.st_blocks);
    printf("最終アクセス時刻 : %s", (char *)ctime(&sb.st_atime));
    printf("最終修正時刻     : %s", (char *)ctime(&sb.st_mtime));
    printf("最終状態変更時刻 : %s", (char *)ctime(&sb.st_ctime));

    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 = show_file_info(argv[1]);
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}


関連ページ