STAT(2)

名前
stat, fstat, lstat - ファイルの状態(status)を得る

書式
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *file_name, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat *buf);

説明

これらの関数は指定されたファイルについての情報を返す。これらの情報を 得るためにはそのファイルに対してのアクセス権は必要ないが、それらの ファイルへ導くパスにあるディレクトリ全ての検索権が必要である。

stat は file_name で指定されたファイルの状態を取得し buf へ格納する。 lstat は stat と同じであるが、リンクを追跡して得られるファイルではなくリンク自身の 状態を取得する点が異っている。 fstat は stat と同じであるが、 file_name のかわりに( open(2) の返す) filedes によって指定されるオープンされたファイルについて状態を取得する。

これらは stat 構造体を返す。 stat 構造体には以下のフィールドが含まれている:

    struct stat
    {
        dev_t         st_dev;      /* device */
        ino_t         st_ino;      /* inode */
        mode_t        st_mode;     /* protection */
        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 type (if inode device) */
        off_t         st_size;     /* total size, in bytes */
        unsigned long st_blksize;  /* blocksize for filesystem I/O */
        unsigned long st_blocks;   /* number of blocks allocated */
        time_t        st_atime;    /* time of last access */
        time_t        st_mtime;    /* time of last modification */
        time_t        st_ctime;    /* time of last change */
    };

st_blocks はブロックのサイズを意味する st_blksize と常に一致するわけではないことに注意すること。 st_blksize はかわりに効率的なファイル・システム I/O のために「都合の良い」値を 返すかもしれない。

全ての Linux のファイル・システムが全ての時間フィールドを 実装(implement)しているわけではない。伝統的に st_atime は mknod(2), utime(2), read(2), write(2), truncate(2) によって変更される。 伝統的に st_mtime は mknod(2), utime(2), write(2) によって変更される。 st_mtime は 所有者(owner)やグループ(group)やハード・リンク数(hard link count)や モード(mode)の変更では変更され ない。 伝統的に st_ctime は書き込みや inode 情報(例えば所有者、グループ、リンク数、モードなど)の 設定によって変更される。

以下の POSIX マクロはファイルの種類のチェックのために定義される :

    S_ISLNK(m)
        シンボリック・リンク(symbolic link)か？

    S_ISREG(m)
        通常のファイルか？

    S_ISDIR(m)
        ディレクトリか？

    S_ISCHR(m)
        キャラクター・デバイス(character device)か？

    S_ISBLK(m)
        ブロック・デバイス(block device)か？

    S_ISFIFO(m)
        fifo か？

    S_ISSOCK(m)
        ソケット(socket)か？

以下のフラグが st_mode フィールドのために定義されている:

    S_IFMT
        00170000 ファイル種別ビットフィールド(bitfield)のためのビットマスク(POSIX にはない)

    S_IFSOCK
        0140000 ソケット(POSIX にはない)

    S_IFLNK
        0120000 シンボリック・リンク(POSIX にはない)

    S_IFREG
        0100000 通常のファイル(POSIX にはない)

    S_IFBLK
        0060000 ブロック・デバイス(POSIX にはない)

    S_IFDIR
        0040000 ディレクトリ(POSIX にはない)

    S_IFCHR
        0020000 キャラクター・デバイス(POSIX にはない)

    S_IFIFO
        0010000 fifo(POSIX にはない)

    S_ISUID
        0004000 set UID bit

    S_ISGID
        0002000 set GID bit

    S_ISVTX
        0001000 スティッキー・ビット(sticky bit)(POSIX にはない)

    S_IRWXU
        00700 ユーザー(ファイルの所有者)の読み込み、書き込み、実行許可

    S_IRUSR
        00400 ユーザーの読み込み許可(POSIXにはない S_IREAD と同じ)

    S_IWUSR
        00200 ユーザーの書き込み許可(POSIXにはない S_IWRITE と同じ)

    S_IXUSR
        00100 ユーザーの実行許可(POSIXにはない S_IEXEC と同じ)

    S_IRWXG
        00070 グループの読み込み、書き込み、実行許可

    S_IRGRP
        00040 グループの読み込み許可

    S_IWGRP
        00020 グループの書き込み許可

    S_IXGRP
        00010 グループの実行許可

    S_IRWXO
        00007 他人(others)の読み込み、書き込み、実行許可

    S_IROTH
        00004 他人の読み込み許可

    S_IWOTH
        00002 他人の書き込み許可

    S_IXOTH
        00001 他人の実行許可

返り値
成功した場合はゼロを返す。エラーの場合は -1 を返し、 errno が適切に設定される。

エラー

EBADF
    filedes が不正

ENOENT
    file_name のパス成分が存在しないか、パスが空文字列である。

ENOTDIR
    パスの成分がディレクトリではない。

ELOOP
    パスを解決する際に遭遇したシンボリック・リンクが多過ぎる。

EFAULT
    アドレスが間違っている。

EACCES
    許可がない。

ENOMEM
    カーネルのメモリが足りない。

ENAMETOOLONG
    ファイル名が長過ぎる。

準拠
stat と fstat コールは SVr4, SVID, POSIX, X/OPEN, 4.3BSD に準拠している。 lstat コールは 4.3BSD と SVr4 に準拠している。 SVr4 には他に fstat のエラーとして EINTR, ENOLINK, EOVERFLOW についての記述がある。 SVr4 には他に stat と lstat のエラーとして EACCES, EINTR, EMULTIHOP, ENOLINK, EOVERFLOW についての 記述がある。

関連項目
chmod(2), chown(2), readlink(2), utime(2)