Manpages

名 前

stat, fstat, lstat, fstatat − フ ァ イ ル の 状 態 を 取 得 す る

書 式

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

int stat(const char *pathname, struct stat *buf);
int fstat(int
fd, struct stat *buf);
int lstat(const char *
pathname, struct stat *buf);

#include <fcntl.h> /* AT_* 定 数 の 定 義 */
#include <sys/stat.h>

int fstatat(int dirfd, const char *pathname, struct stat *buf,
int
flags);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

lstat():

/* glibc 2.19 以 前 */ _BSD_SOURCE ||
/* glibc 2.20 以 降 */_DEFAULT_SOURCE ||
_XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* glibc 2.10 以 降 : */ _POSIX_C_SOURCE >= 200112L

fstatat():

glibc 2.10 以 降 :

_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L

glibc 2.10 よ り 前 :

_ATFILE_SOURCE

説 明

こ れ ら の 関 数 は 、 フ ァ イ ル に つ い て の 情 報 を stat が 指 す バ ッ フ ァ ー に 格 納 し て 返 す 。 フ ァ イ ル そ の も の に 対 す る ア ク セ ス 許 可 は 必 要 と し な い が 、 —stat(), fstatat(), lstat() の 場 合 に は —そ の フ ァ イ ル へ 至 る pathname を 構 成 す る 全 て の デ ィ レ ク ト リ に 対 す る 実 行 (検 索 ) 許 可 が 必 要 で あ る 。

stat() と fstatat() は pathname が 指 す フ ァ イ ル に 関 す る 情 報 を 取 得 す る 。 fstatat() の 違 い に つ い て は 後 で 説 明 す る 。

lstat() は stat() と 同 じ で あ る が 、 pathnames が シ ン ボ リ ッ ク リ ン ク の 場 合 、 リ ン ク が 参 照 し て い る フ ァ イ ル で は な く 、 リ ン ク 自 身 の 状 態 を 返 す 点 が 異 な る 。

fstat() は stat() と 同 じ だ が 、 状 態 を 取 得 す る フ ァ イ ル を フ ァ イ ル デ ィ ス ク リ プ タ ー fd で 指 定 す る 点 が 異 な る 。 こ れ ら の シ ス テ ム コ ー ル は い ず れ も 、 結 果 を stat 構 造 体 に 入 れ て 返 す 。 stat 構 造 体 に は 以 下 の フ ィ ー ル ド が 含 ま れ て い る :

struct stat {
dev_t st_dev; /* フ ァ イ ル が あ る デ バ イ ス の ID */
ino_t st_ino; /* inode 番 号 */
mode_t st_mode; /* ア ク セ ス 保 護 */
nlink_t st_nlink; /* ハ ー ド リ ン ク の 数 */
uid_t st_uid; /* 所 有 者 の ユ ー ザ ー ID */
gid_t st_gid; /* 所 有 者 の グ ル ー プ ID */
dev_t st_rdev; /* デ バ イ ス ID (特 殊 フ ァ イ ル の 場 合 ) */
off_t st_size; /* 全 体 の サ イ ズ (バ イ ト 単 位 ) */
blksize_t st_blksize; /* フ ァ イ ル シ ス テ ム I/O で の ブ ロ ッ ク サ イ ズ
*/
blkcnt_t st_blocks; /* 割 り 当 て ら れ た 512B の ブ ロ ッ ク 数 */ };

/* Linux 2.6 以 降 で は 、 カ ー ネ ル は 以 下 の タ イ ム ス タ ン プ フ ィ ー ル ド で ナ ノ 秒 の 精 度 を サ ポ ー ト し て い る 。
Linux 2.6 よ り 前 の バ ー ジ ョ ン で の 詳 細 は 下 記 の 「 注 意 」 を 参 照 。
*/

struct timespec st_atim; /* 最 終 ア ク セ ス 時 刻 */
struct timespec st_mtim; /* 最 終 修 正 時 刻 */
struct timespec st_ctim; /* 最 終 状 態 変 更 時 刻 */

#define st_atime st_atim.tv_sec /* 後 方 互 換 性 */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec }; 注 意 : stat 構 造 体 の フ ィ ー ル ド の 順 序 は ア ー キ テ ク チ ャ ー に よ り 様 々 で あ る 。 ま た 、 上 記 の 定 義 で は 、 フ ィ ー ル ド 間 に 存 在 す る こ と が あ る パ デ ィ ン グ バ イ ト は 書 か れ て い な い 。 こ の パ デ ィ ン グ バ イ ト は ア ー キ テ ク チ ャ ー に よ っ て も 異 な る 。 詳 細 を 知 る 必 要 が あ る 場 合 は glibc と カ ー ネ ル の ソ ー ス を 調 べ て ほ し い 。

st_dev フ ィ ー ル ド は 、 こ の フ ァ イ ル が 存 在 す る デ バ イ ス を 示 す (マ ク ロ major(3), minor(3) は 、 こ の フ ィ ー ル ド の デ バ イ ス ID を 分 解 す る の に 役 立 つ だ ろ う )。

st_rdev フ ィ ー ル ド は 、 こ の フ ァ イ ル (inode) が 表 す デ バ イ ス を 示 す 。

st_size フ ィ ー ル ド は 、 (通 常 の フ ァ イ ル か シ ン ボ リ ッ ク リ ン ク の 場 合 に ) フ ァ イ ル の 大 き さ を バ イ ト 単 位 で 示 す 。 シ ン ボ リ ッ ク リ ン ク の 大 き さ は 、 シ ン ボ リ ッ ク リ ン ク に 含 ま れ て い る パ ス 名 の 長 さ (終 端 の ヌ ル バ イ ト は 含 ま な い ) で あ る 。

st_blocks フ ィ ー ル ド は 、 フ ァ イ ル の 大 き さ を 512 バ イ ト の ブ ロ ッ ク サ イ ズ 単 位 で 示 す フ ィ ー ル ド は 、 フ ァ イ ル に 割 り 当 て さ れ た ブ ロ ッ ク 数 を 512 バ イ ト 単 位 で 示 す 。 (フ ァ イ ル に 穴 が あ る よ う な 場 合 、 こ の 値 は st_size/512 よ り 小 さ く な る こ と も あ る )。

st_blksize フ ィ ー ル ド は 、 効 率 的 に フ ァ イ ル シ ス テ ム I/O が で き る 「 好 ま し い 」 ブ ロ ッ ク サ イ ズ を 示 す (も っ と 小 さ い 単 位 で フ ァ イ ル に 書 き 込 み を 行 う と 、 読 み 出 し −−修 正 −−再 書 き 込 み と い っ た 非 効 率 な 動 作 に な っ て し ま う か も し れ な い )。 全 て の Linux の フ ァ イ ル シ ス テ ム が 全 て の 時 間 フ ィ ー ル ド を 実 装 し て い る わ け で は な い 。 フ ァ イ ル や デ ィ レ ク ト リ の ア ク セ ス が st_atime フ ィ ー ル ド を 更 新 し な い よ う な か た ち で マ ウ ン ト で き る フ ァ イ ル シ ス テ ム も あ る 。 (mount(8) の noatime, nodiratime, relatimemount(2) の 関 連 す る 情 報 を 参 照 )。 ま た 、 フ ァ イ ル が O_NOATIME 付 き で オ ー プ ン さ れ て い る 場 合 に は st_atime は 更 新 さ れ な い 。 open(2) 参 照 。

st_atime フ ィ ー ル ド は フ ァ イ ル ア ク セ ス が あ っ た 場 合 に 変 更 さ れ る (例 え ば 、 execve(2), mknod(2), pipe(2), utime(2) を 使 用 し た 場 合 や read(2) で 1 バ イ ト 以 上 読 み 込 ん だ 場 合 な ど )。 mmap(2) な ど の 他 の ル ー チ ン で は 、 st_atime は 更 新 さ れ る こ と も あ れ ば 、 そ う で な い 場 合 も あ る 。

st_mtime フ ィ ー ル ド は 、 フ ァ イ ル が 修 正 さ れ た 場 合 に 変 更 さ れ る (例 え ば 、 mknod(2), truncate(2), utime(2) を 使 用 し た 場 合 や write(2) で 1 バ イ ト 以 上 書 き 込 み を し た 場 合 な ど )。 さ ら に 、 デ ィ レ ク ト リ の st_mtime は 、 そ の デ ィ レ ク ト リ で フ ァ イ ル が 作 成 さ れ た り 削 除 さ れ た り す る と 変 更 さ れ る 。 st_mtime フ ィ ー ル ド は 所 有 者 や グ ル ー プ や ハ ー ド リ ン ク 数 や モ ー ド の 変 更 で は 変 更 さ れ な い 。

st_ctime フ ィ ー ル ド は 書 き 込 み や inode 情 報 (所 有 者 、 グ ル ー プ 、 リ ン ク 数 、 モ ー ド な ど ) の 設 定 に よ っ て 変 更 さ れ る 。 以 下 の マ ス ク 値 が st_mode フ ィ ー ル ド の フ ァ イ ル 種 別 の 検 査 用 に 定 義 さ れ て い る 。

し た が っ て 、 (例 え ば ) 通 常 の フ ァ イ ル か ど う か を 検 査 す る に は 、 以 下 の よ う に す れ ば よ い 。

stat(pathname, &sb);
if ((sb.st_mode & S_IFMT) == S_IFREG) {
/* Handle regular file */ } 上 記 の 形 の 検 査 は よ く あ る の で 、 POSIX で は 以 下 の マ ク ロ が 定 義 さ れ て お り 、 st_mode の フ ァ イ ル 種 別 の 検 査 を よ り 簡 単 に 書 け る よ う に な っ て い る 。

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

?

S_ISDIR(m) デ ィ レ ク ト リ か

?

S_ISCHR(m) キ ャ ラ ク タ ー デ バ イ ス か

?

S_ISBLK(m) ブ ロ ッ ク デ バ イ ス か

?

S_ISFIFO(m)

FIFO (名 前 付 き パ イ プ ) か ?

S_ISLNK(m)

シ ン ボ リ ッ ク リ ン ク か ? (POSIX.1−1996 に は な い )
S_ISSOCK
(m) ソ ケ ッ ト か ? (POSIX.1−1996 に は な い )

上 で 挙 げ た コ ー ド は 以 下 の よ う に 書 き 換 え る こ と が で き る 。

stat(pathname, &sb);
if (S_ISREG(sb.st_mode)) {
/* Handle regular file */ } 上 記 の ほ と ん ど の フ ァ イ ル 種 別 検 査 マ ク ロ の 定 義 は 、 機 能 検 査 マ ク ロ _BSD_SOURCE (glibc 2.19 以 前 の 場 合 )、 _SVID_SOURCE (glibc 2.19 以 前 の 場 合 )、 _DEFAULT_SOURCE (glibc 2.20 以 降 の 場 合 ) の い ず れ か が 定 義 さ れ て い る 場 合 に 公 開 さ れ る 。 さ ら に 、 S_IFSOCKS_ISSOCK 以 外 の 上 記 の す べ て の マ ク ロ の 定 義 は _XOPEN_SOURCE が 定 義 さ れ て い る 場 合 に も 公 開 さ れ る 。 S_IFSOCK の 定 義 は _XOPEN_SOURCE が 値 500 以 上 で 定 義 さ れ た 場 合 に も 公 開 さ れ る 。

S_ISSOCK() の 定 義 が 公 開 さ れ る の は 以 下 の 機 能 検 査 マ ク ロ が 定 義 さ れ て い る 場 合 で あ る : _BSD_SOURCE (glibc 2.19 以 前 の 場 合 )、 _DEFAULT_SOURCE (glibc 2.20 以 降 の 場 合 )、 値 500 以 上 の _XOPEN_SOURCE、 値 が 200112L 以 上 の _POSIX_C_SOURCE。 以 下 の マ ス ク 値 が st_mode フ ィ ー ル ド の フ ァ イ ル の ア ク セ ス 許 可 の 検 査 用 に 定 義 さ れ て い る 。

set−group−ID bit (S_ISGID) に は い く つ か の 特 殊 な 使 用 法 が あ る : デ ィ レ ク ト リ に 設 定 し た 場 合 に は 、 そ の デ ィ レ ク ト リ が BSD 方 式 で 使 用 さ れ る こ と を 示 す 。 つ ま り 、 そ の デ ィ レ ク ト リ に 作 成 さ れ た フ ァ イ ル の グ ル ー プ ID は 作 成 し た プ ロ セ ス の 実 効 (effective) グ ル ー プ ID で は な く 、 デ ィ レ ク ト リ の グ ル ー プ ID を 継 承 す る 。 ま た 、 そ の デ ィ レ ク ト リ に 作 成 さ れ た デ ィ レ ク ト リ に も S_ISGID ビ ッ ト が 設 定 さ れ る 。 グ ル ー プ 実 行 ビ ッ ト (S_IXGRP) が 設 定 さ れ て い な い フ ァ イ ル に 設 定 さ れ た 場 合 は 、 set−group−ID ビ ッ ト は フ ァ イ ル /レ コ ー ド の 強 制 的 な (mandatory) ロ ッ ク を 表 す 。 デ ィ レ ク ト リ に ス テ ィ ッ キ ー ビ ッ ト (S_ISVTX) が 設 定 さ れ た 場 合 は 、 そ の デ ィ レ ク ト リ の フ ァ イ ル の 名 前 を 変 更 し た り 、 削 除 し た り で き る の は 、 そ の フ ァ イ ル の 所 有 者 か 、 そ の デ ィ レ ク ト リ の 所 有 者 か 、 特 権 プ ロ セ ス だ け と な る 。

fstatat()
fstatat
() シ ス テ ム コ ー ル は stat() と 全 く 同 様 に 動 作 す る が 、 以 下 で 説 明 す る 点 が 異 な る 。 指 定 さ れ た pathname が 相 対 パ ス の 場 合 、 フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る (stat() に 相 対 パ ス を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。

pathname が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 (stat(2) と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。

pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。 こ の flags 引 き 数 は 下 記 の フ ラ グ の 0 個 以 上 の 論 理 和 を 取 っ た も の で あ る :
AT_EMPTY_PATH
(Linux 2.6.39 以 降 )

pathname が 空 文 字 列 の 場 合 、 dirfd が 参 照 す る フ ァ イ ル に 対 し て 操 作 を 行 う (dirfdopen(2)O_PATH フ ラ グ を 使 っ て 取 得 で き る )。 dirfdAT_FDCWD の 場 合 、 呼 び 出 し は カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 し て 操 作 を 行 う 。 こ の 場 合 、 dirfd は 、 デ ィ レ ク ト リ だ け で な く 、 任 意 の タ イ プ の フ ァ イ ル を 参 照 す る こ と が で き る 。 こ の フ ラ グ は Linux 固 有 で あ り 、 そ の 定 義 を 得 る に は _GNU_SOURCE を 定 義 す る こ と 。

AT_NO_AUTOMOUNT (Linux 2.6.38 以 降 )

pathname が オ ー ト マ ウ ン ト ポ イ ン ト と な っ て い る デ ィ レ ク ト リ の 場 合 、 pathname の 最 終 ("basename") 要 素 の オ ー ト マ ウ ン ト を 行 わ な い 。 こ れ に よ り (マ ウ ン ト さ れ る は ず の 場 所 で は な く ) オ ー ト マ ウ ン ト ポ イ ン ト の 属 性 を 取 得 す る こ と が で き る 。 こ の フ ラ グ を 使 う と 、 デ ィ レ ク ト リ を ス キ ャ ン す る ツ ー ル が オ ー ト マ ウ ン ト ポ イ ン ト の デ ィ レ ク ト リ を 大 量 に オ ー ト マ ウ ン ト し て し ま う の を 防 ぐ こ と が で き る 。 マ ウ ン ト ポ イ ン ト が す で に マ ウ ン ト さ れ て い る 場 合 AT_NO_AUTOMOUNT フ ラ グ は 何 の 効 果 も な い 。 こ の フ ラ グ は Linux 固 有 で あ り 、 そ の 定 義 を 得 る に は _GNU_SOURCE を 定 義 す る こ と 。

AT_SYMLINK_NOFOLLOW

(lstat() 同 様 ) pathname が シ ン ボ リ ッ ク リ ン ク の 場 合 リ ン ク の 展 開 を 行 わ ず 、 リ ン ク 自 身 の 情 報 を 返 す (デ フ ォ ル ト で は 、 fstatat() は 、 stat() と 同 様 に 、 シ ン ボ リ ッ ク リ ン ク の 展 開 を 行 う )。

fstatat() の 必 要 性 に つ い て の 説 明 に つ い て は openat(2) を 参 照 。

返 り 値

成 功 し た 場 合 、 0 が 返 さ れ る 。 失 敗 し た 場 合 、 −1 が 返 さ れ 、 errno に 適 切 な 値 が セ ッ ト さ れ る 。

エ ラ ー

EACCES

pathname が 所 属 す る デ ィ レ ク ト リ と そ の 上 位 の デ ィ レ ク ト リ の い ず れ か に 対 す る 検 索 許 可 が な か っ た (path_resolution(7) も 参 照 の こ と )。

EBADF

fd が 不 正 で あ る 。

EFAULT

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

ELOOP パ ス を 辿 る 際 に 解 決 す べ き シ ン ボ リ ッ ク リ ン ク が 多 過 ぎ た 。

ENAMETOOLONG

pathname が 長 過 ぎ る 。

ENOENT

pathname の 構 成 要 素 が 存 在 し な い か 、 pathname が 空 文 字 列 で あ る 。

ENOMEM

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

ENOTDIR

pathname の 前 半 部 分 (prefix) の 構 成 要 素 が デ ィ レ ク ト リ で は な い 。

EOVERFLOW

pathname ま た は fd が 、 フ ァ イ ル サ イ ズ 、 inode 番 号 、 ブ ロ ッ ク 数 が そ れ ぞ れ off_t 型 、 ino_t 型 、 blkcnt_t 型 で 表 現 で き な い フ ァ イ ル を 参 照 し て い る 。 こ の エ ラ ー が 起 こ る の は 、 例 え ば 、 32 ビ ッ ト プ ラ ッ ト フ ォ ー ム 上 で −D_FILE_OFFSET_BITS=64 を 指 定 せ ず に コ ン パ イ ル さ れ た ア プ リ ケ ー シ ョ ン が 、 フ ァ イ ル サ イ ズ が (1<<31)−1 バ イ ト を 超 え る フ ァ イ ル に 対 し て stat() を 呼 び 出 し た 場 合 で あ る 。

fstatat() で は 以 下 の エ ラ ー も 発 生 す る こ と が あ る 。

EBADF

dirfd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。

EINVAL

flags に 無 効 な フ ラ グ が 指 定 さ れ た 。

ENOTDIR

pathname が 相 対 パ ス で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。

バ ー ジ ョ ン

fstatat() は カ ー ネ ル 2.6.16 で Linux に 追 加 さ れ た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は バ ー ジ ョ ン 2.4 で glibc に 追 加 さ れ た 。

準 拠

stat(), fstat(), lstat(): SVr4, 4.3BSD, POSIX.1−2001, POSIX.1.2008.

fstatat(): POSIX.1−2008.

POSIX.1−2001 で は 、 シ ン ボ リ ッ ク リ ン ク に 対 す る lstat() で 有 効 な 情 報 を 返 す よ う に 求 め ら れ て い た の は 、 stat 構 造 体 の st_sizest_mode の フ ァ イ ル 種 別 要 素 だ け で あ っ た 。 POSIX.1−2008 で は 規 定 が 厳 し く な り 、 lstat() は st_mode の ア ク セ ス 許 可 ビ ッ ト 以 外 の 全 て の フ ィ ー ル ド に 有 効 な 情 報 を 返 す こ と が 求 め ら れ る よ う に な っ て い る 。

st_blocksst_blksize フ ィ ー ル ド の 使 用 は あ ま り 移 植 性 が な い (こ れ ら の フ ィ ー ル ド は BSD に よ っ て 導 入 さ れ た 。 シ ス テ ム ご と に 解 釈 が 異 な っ て お り 、 NFS マ ウ ン ト の 場 合 に は 同 じ シ ス テ ム で も 異 な る 可 能 性 が あ る )。 <sys/stat.h> か ら blkcnt_tblksize_t 型 定 義 を 読 み 込 み た い 場 合 は 、 (ど の ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り も 前 に ) _XOPEN_SOURCE を 500 以 上 の 値 で 定 義 す る こ と 。

POSIX.1−1990 に は S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX 定 数 に 関 す る 記 述 は な か っ た が 、 代 わ り に S_ISDIR() の よ う な マ ク ロ を 使 用 す る よ う に 要 求 し て い た 。 S_IF* 定 数 は POSIX.1−2001 以 降 に は 存 在 す る 。 マ ク ロ S_ISLNK() と S_ISSOCK() は POSIX.1−1996 に は な い が 、 POSIX.1−2001 に は 両 方 と も 存 在 す る 。 前 者 は SVID 4 に 、 後 者 は SUSv2 に 由 来 し て い る 。

UNIX V7 (と そ の 後 の シ ス テ ム ) は S_IREAD, S_IWRITE, S_IEXEC を 持 っ て お り 、 POSIX は そ の 同 義 語 と し て S_IRUSR, S_IWUSR, S_IXUSR を 規 定 し て い る 。 他 の シ ス テ ム 各 種 シ ス テ ム で 使 用 さ れ て い た (い る )値 :

ス テ ィ ッ キ ー コ マ ン ド は Version 32V AT&T UNIX で 登 場 し た 。

注 意

Linux で は 、 lstat() は 一 般 に は 自 動 マ ウ ン ト 動 作 (automounter action) の き っ か け と な ら な い が 、 stat() は き っ か け と な る (fstatat(2) を 参 照 )。

/proc デ ィ レ ク ト リ 以 下 に あ る フ ァ イ ル の ほ と ん ど で は 、 stat() を 呼 び 出 し た 際 に 、 st_size フ ィ ー ル ド に フ ァ イ ル サ イ ズ が 返 さ れ な い 。 代 わ り に st_size フ ィ ー ル ド に は 0 が 返 さ れ る 。 タ イ ム ス タ ン プ フ ィ ー ル ド 古 い カ ー ネ ル や 古 い 標 準 で は 、 ナ ノ 秒 精 度 の タ イ ム ス タ ン プ フ ィ ー ル ド は サ ポ ー ト さ れ て い な か っ た 。 代 わ り に 3 つ の time_t 型 の タ イ ム ス タ ン プ フ ィ ー ル ド st_atime, st_mtime, and st_ctime が あ っ た 。 こ れ ら の フ ィ ー ル ド に は 1 秒 単 位 の タ イ ム ス タ ン プ が 記 録 さ れ て い た 。 カ ー ネ ル 2.5.48 以 降 で は 、 stat 構 造 体 は 3 つ の フ ァ イ ル の タ イ ム ス タ ン プ 関 連 の フ ィ ー ル ド で ナ ノ 秒 単 位 の 精 度 に 対 応 し て い る 。 機 能 検 査 マ ク ロ _BSD_SOURCE_SVID_SOURCE が 定 義 さ れ た 場 合 に 、 各 タ イ ム ス タ ン プ の ナ ノ 秒 の 情 報 は st_atim.tv_nsec と い う 形 式 の 名 前 で 参 照 で き る 。 ナ ノ 秒 の タ イ ム ス タ ン プ は 現 在 で は 標 準 化 さ れ て お り 、 POSIX.1−2008 か ら で あ る 。 バ ー ジ ョ ン 2.12 以 降 の glibc で は 、 _POSIX_C_SOURCE が 200809L 以 上 の 値 で 定 義 さ れ る か 、 _XOPEN_SOURCE が 700 以 上 の 値 で 定 義 さ れ た 場 合 に も 、 こ の ナ ノ 秒 の タ イ ム ス タ ン プ が 公 開 さ れ る 。 上 記 の マ ク ロ の い ず れ も 定 義 さ れ て い な い 場 合 、 ナ ノ 秒 の 値 は st_atimensec と い う 形 式 の 名 前 で 公 開 さ れ る 。 ナ ノ 秒 の タ イ ム ス タ ン プ は XFS, JFS, Btrfs, ext4 で サ ポ ー ト さ れ て い る (Linux 2.6.23 以 降 )。 ナ ノ 秒 の タ イ ム ス タ ン プ は ext2, ext3, Reiserfs で は サ ポ ー ト さ れ て い な い 。 サ ブ 秒 の タ イ ム ス タ ン プ を サ ポ ー ト し て い な い フ ァ イ ル シ ス テ ム で は 、 ナ ノ 秒 の フ ィ ー ル ド に は 値 0 が 入 る 。 背 後 の カ ー ネ ル イ ン タ ー フ ェ ー ス 時 間 の 経 過 と と も に 、 stat 構 造 体 の サ イ ズ が 大 き く な り 、 こ の 影 響 で stat() に は 3つ の バ ー ジ ョ ン が 存 在 す る : sys_stat() (ス ロ ッ ト は __NR_oldstat)、 sys_newstat() (ス ロ ッ ト は __NR_stat)、 sys_stat64() (カ ー ネ ル 2.4 で 導 入 ; ス ロ ッ ト は __NR_stat64). glibc の stat() ラ ッ パ ー 関 数 は こ れ ら の 詳 細 を ア プ リ ケ ー シ ョ ン か ら 隠 蔽 し て く れ る 。 具 体 的 に は 、 カ ー ネ ル が 提 供 し て い る シ ス テ ム コ ー ル の う ち 最 新 の バ ー ジ ョ ン を 起 動 し 、 古 い バ イ ナ リ の 場 合 に は 必 要 に 応 じ て 返 さ れ た 情 報 を 再 構 成 (repack) す る 。 fstat() と lstat() に つ い て も 同 様 で あ る 。

glibc の fstatat() ラ ッ パ ー 関 数 が 内 部 で 利 用 す る シ ス テ ム コ ー ル は 、 実 際 に は fstatat64() で あ る 。

以 下 の プ ロ グ ラ ム は stat() を 呼 び 出 し 、 返 っ て き た stat 構 造 体 の フ ィ ー ル ド の い く つ か を 表 示 す る 。

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

int
main(int argc, char *argv[])
{
struct stat sb;

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

if (stat(argv[1], &sb) == −1) {
perror("stat");
exit(EXIT_FAILURE); }

printf("File type: ");

switch (sb.st_mode & S_IFMT) {
case S_IFBLK: printf("block device\n"); break;
case S_IFCHR: printf("character device\n"); break;
case S_IFDIR: printf("directory\n"); break;
case S_IFIFO: printf("FIFO/pipe\n"); break;
case S_IFLNK: printf("symlink\n"); break;
case S_IFREG: printf("regular file\n"); break;
case S_IFSOCK: printf("socket\n"); break;
default: printf("unknown?\n"); break; }

printf("I−node number: %ld\n", (long) sb.st_ino);

printf("Mode: %lo (octal)\n",
(unsigned long) sb.st_mode);

printf("Link count: %ld\n", (long) sb.st_nlink);
printf("Ownership: UID=%ld GID=%ld\n",
(long) sb.st_uid, (long) sb.st_gid);

printf("Preferred I/O block size: %ld bytes\n",
(long) sb.st_blksize);
printf("File size: %lld bytes\n",
(long long) sb.st_size);
printf("Blocks allocated: %lld\n",
(long long) sb.st_blocks);

printf("Last status change: %s", ctime(&sb.st_ctime));
printf("Last file access: %s", ctime(&sb.st_atime));
printf("Last file modification: %s", ctime(&sb.st_mtime));

exit(EXIT_SUCCESS); }

関 連 項 目

ls(1), stat(1), access(2), chmod(2), chown(2), readlink(2), utime(2), capabilities(7), symlink(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。