STAT(2) — UNIX Programmer’s Manual
名称
stat, lstat, fstat − ファイルステータスを取り出す
形式
#include <sys/types.h>
#include <sys/stat.h>
stat(path, buf)
char ∗path;
struct stat ∗buf;
lstat(path, buf)
char ∗path;
struct stat ∗buf;
fstat(fd, buf)
int fd;
struct stat ∗buf;
解説
stat は、 ファイルの path に関する情報を取り出します。 指定されたファイルの読み取り、 書き込み、 または実行パーミッションは必要とされませんが、 ファイルに先行するパス名に含まれている すべてのディレクトリは到達可能でなければなりません。
lstat は指定されたファイルがシンボリックリンクである場合に そのリンクに関する情報を返し、 stat はそのリンクの指しているファイルに関する情報を 返すことを除けば、 lstat は stat と同じです。
fstat は、 引数のディスクリプタで指されたオープンされているファイルに関する情報を 取り出します。 この情報は open コールによって得られるものと同様です。
buf は、 ファイルに関する情報が入れられる stat 構造体へのポインタです。 buf によって指し示される構造体の内容は、 次のとおりです。
struct stat {
dev_tst_dev;/∗ device inode resides on ∗/
ino_tst_ino;/∗ this inode’s number ∗/
u_shortst_mode;/∗ protection ∗/
shortst_nlink;/∗ number or hard links to the file ∗/
uid_tst_uid;/∗ user-id of owner ∗/
gid_tst_gid;/∗ group-id of owner ∗/
dev_tst_rdev;/∗ the device type, for inode that is device ∗/
off_tst_size;/∗ total size of file ∗/
time_tst_atime;/∗ file last access time ∗/
intst_spare1;
time_tst_mtime;/∗ file last modify time ∗/
intst_spare2;
time_tst_ctime;/∗ file last status change time ∗/
intst_spare3;
longst_blksize;/∗ optimal blocksize for file system i/o ops ∗/
longst_blocks;/∗ actual number of blocks allocated ∗/
longst_spare4[2];
};
st_atime ファイルデータが最後に読み取られた、 または修正された日時。 システムコール mknod(2)、 utimes(2)、 read(2)、 write(2) によって変更されます。 効率上の理由から、 (この方が実際的だと思いますが)ディレクトリが サーチされるときに st_atime はセットされません。
st_mtime ファイルが最後に修正された日時。 所有者、 グループ、 リンク数、 またはモードが変更されても、 セットされません。 システムコール mknod(2)、 utimes(2)、 write(2) によって変更されます。
st_ctime ファイルステータスが最後に変更された日時。 書き込みとiノードの変更によってセットされます。 システムコール chmod(2)、 chown(2)、 link(2)、 mknod(2)、 rename(2)、 unlink(2)、 utimes(2)、 write(2) によって変更されます。
ステータス情報ワード st_mode には次のビットがあります。
#define S_IFMT0170000/∗ type of file ∗/
#define S_IFDIR0040000/∗ directory ∗/
#define S_IFCHR0020000/∗ character special ∗/
#define S_IFBLK0060000/∗ block special ∗/
#define S_IFREG0100000/∗ regular ∗/
#define S_IFLNK0120000/∗ symbolic link ∗/
#define S_IFSOCK0140000/∗ socket ∗/
#define S_ISUID0004000/∗ set user id on execution ∗/
#define S_ISGID0002000/∗ set group id on execution ∗/
#define S_ISVTX0001000/∗ save swapped text even after use ∗/
#define S_IREAD0000400/∗ read permission, owner ∗/
#define S_IWRITE0000200/∗ write permission, owner ∗/
#define S_IEXEC0000100/∗ execute/search permission, owner ∗/
モードビット 0000070 および 0000007 は、 グループおよびその他のユーザのパーミッションです (chmod(2) 参照)。
リターン値
正常終了した場合には、 値 0 が返されます。 そうでない場合には、 値 −1 が返され、 errno がエラーを 示すようにセットされます。
エラー
以下に示されている項目のうちの1つまたは複数が真である場合には、 stat と lstat は失敗します。
[ENOTDIR] パスプレフィックスの構成要素がディレクトリではないものがある。
[EINVAL] パス名に最上位ビットのセットされたキャラクタが含まれている。 (NEWS-OS ではおきない。)
[ENAMETOOLONG]
パス名の 1構成要素が 255 バイトを 超えている、 またはパス名全体が 1023 バイトを 超えている。
[ENOENT] 指定されたファイルが存在していない。
[EACCES] パスプレフィックスの構成要素についてサーチパーミッションが 否定されているものがある。
[ELOOP] パス名の処理で遭遇したシンボリックリンクの数が多すぎる。
[EFAULT] buf または name が、無効なアドレス指し示している。
[EIO] ファイルシステムへの書き込みまたはファイルシステムからの読み取りを 行っている間に入出力エラーが発生した。
次の項目のうちの 1つまたは複数が真である場合には、 fstat は失敗します。
[EBADF] fildes が有効なオープンファイルディスクリプタではない。
[EFAULT] buf が無効なアドレスを指し示している。
[EIO] ファイルシステムへの書き込みまたはファイルシステムからの読み取りを 行っている間に入出力エラーが発生した。
警告
現在 st_spare1、 st_spare2、 st_spare3 とマークされているstat構造体内のフィールドは、 将来iノードの日時スタンプを 64ビットに拡張するためのものです。 しかし、 これは、 (utimes(2) へのコールで)連続している日時スタンプに依存するプログラムを 破壊することもあります。
関連事項
バグ
fstat を ソケット(およびパイプ)に対して使用すると、 (ブロックサイズのフィールド以外)ゼロにされたバッファと、 一意なデバイスおよびiノードの番号が返されます。
NEWS-OSRelease 3.3