C言語 - 標準ライブラリ - stat.h

 クラウディア
1. 概要
2. ファイル情報
3. stat 構造体

1. 概要

 「stat.h」は、ファイルの情報を取得する関数を定義しています。  本ページは、下記のサイトを参考にさせていただきました。
第72章 stat 構造体

2. ファイル情報


#include <sys/types.h>
#include <sys/stat.h>

int stat(const char *path, struct stat *sb);
int lstat(const char *path, struct stat *sb);
int fstat(int fd, struct stat *sb);
 「stat()」は、「path」が指すファイルの情報を取得します。  指定したファイルの読取り権、書込み権、実行権は必要ありません。  しかし、そのファイルへ至るパス名で列挙されたすべてのディレクトリは、検索可能であることが必要です。  「lstat()」関数は、「stat()」に似ていますが、指定したファイルがシンボリックリンクである場合は異なります。  「lstat()」はリンクの情報を戻しますが、「stat()」はリンクが参照するファイルの情報を返します。  「fstat()」システムコールは、ファイル記述子「fd」で区別されるオープンファイルについて、上と同じ情報を取得します。  成功して終了したときには値「0」を返します。  そうでない場合、値「-1」が返され、グローバル変数「errno」が設定されてエラーを示します。  「stat()」と「lstat()」は、以下のような場合にエラーとなります。 ・EACCES 指定されたパスには、検索が許可されていないディレクトリが含まれている ・EFAULT 「sb」引数または「path」引数が、プロセスに割り当てられたアドレス空間の範囲外 ・EIO ファイルシステムでの読み書き中に入出力エラーが発生 ・ELOOP パス名を変換するときに検出されたシンボリックリンクが多すぎ ・ENAMETOOLONG パス名の構成要素が 255 文字を越えているか、またはパス名全体が 1023 文字を越えている ・ENOENT 指定されたファイルが存在しない ・ENOTDIR パスの構成要素中にディレクトリ以外のものが含まれている ・EOVERFLOW ファイルサイズのバイト数が、「sb」で指されている構造体で正しく表現できない  「fstat()」は、以下のような場合にエラーとなります。 ・EBADF 「fd」引数が、有効な記述子でない ・EFAULT sb 引数が、プロセスに割り当てられたアドレス空間の範囲外を指している ・EIO ファイルシステムに読み書きしている間に入出力エラーが発生 ・EOVERFLOW ファイルサイズのバイト数が、「sb」で指されている構造体で正しく表現できない  わたしは、もっぱら、ファイルやディレクトリの有無を見るときに単に戻り値だけを見たりします。  正確には、「sb」の中も見なければだめなんですけどね。

3. stat 構造体

 「stat」構造体は、およそ下記のような形式です。  (実際のヘッダファイル内は、もっとプリプロセッサまみれで、複雑)

struct stat {
    dev_t     st_dev;         /* ID of device containing file */
    ino_t     st_ino;         /* Inode number */
    mode_t    st_mode;        /* File type and mode */
    nlink_t   st_nlink;       /* Number of hard links */
    uid_t     st_uid;         /* User ID of owner */
    gid_t     st_gid;         /* Group ID of owner */
    dev_t     st_rdev;        /* Device ID (if special file) */
    off_t     st_size;        /* Total size, in bytes */
    blksize_t st_blksize;     /* Block size for filesystem I/O */
    blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

    /* Since Linux 2.6, the kernel supports nanosecond
       precision for the following timestamp fields.
       For the details before Linux 2.6, see NOTES. */

    struct timespec st_atim;  /* Time of last access */
    struct timespec st_mtim;  /* Time of last modification */
    struct timespec st_ctim;  /* Time of last status change */

#define st_atime st_atim.tv_sec      /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
earthcar(アースカー)