構文
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
説明
stat() 関数は指定されたファイルの情報を取得し、それを buf 引き数が指す領域に書き込みます。 path 引き数は、マウントされているファイルシステム内の任意のファイルのパス名を指すポインターです
(パス名に出てくるディレクトリは、すべて検索可能でなければなりません)。
指定したファイルの読み取り、書き込み、または実行のパーミッションは必要ありませんが、パス名の中で最後のファイル名より前に出てくるディレクトリは、すべて検索可能でなければなりません。
ファイルアクセス制御の機構が追加されていたり、異なるファイルアクセス制御が使われていたりするシステムでは、その機構の処理系の条件によっては、 stat() が失敗する場合があります。
特に、システムによっては、 path で指定したファイルが存在しないこともあります。
引き数 buf は stat 構造体へのポインターです。 stat 構造体は、ヘッダー <sys/stat.h> で定義されていて、
その中にファイルに関連する情報が格納されます。 stat 構造体は以下のメンバーを含んでいます。
| dev_t | st_dev; | /* ID of device containing a */ |
| | /* directory entry for this file */ |
| ino_t | st_ino; | /* Inode number */ |
| short | st_fstype; | /* Type of filesystem this file */ |
| | /* is in; see sysfs(2) */ |
| ushort | st_mode; | /* File type, attributes, and */ |
| | /* access control summary */ |
| ushort | st_basemode | /* Permission bits (see chmod(1))
*/ |
| ushort | st_nlink; | /* Number of links */ |
| uid_t | st_uid; | /* User ID of file owner */ |
| gid_t | st_gid; | /* Group ID of file group */ |
| dev_t | st_rdev; | /* Device ID; this entry defined */ |
| | /* only for char or blk spec files
*/ |
| off_t | st_size; | /* File size (bytes) */ |
| time_t | st_atime; | /* Time of last access */ |
| time_t | st_mtime; | /* Last modification time */ |
| time_t | st_ctime; | /* Last file status change time */ |
| | /* Measured in secs since */ |
| | /* 00:00:00 GMT, Jan 1, 1970 */ |
| long | st_blksize; | /* File system block size */ |
| uint | st_acl:1; | /* Set if the file has optional */ |
| | /* access control list entries */ |
| | /* HFS File Systems only */ |
| uint | st_aclv:1; | /* Set if the file has optional */ |
| | /* access control list entries */ |
| | /* JFS File Systems only */ |
(このリストの中の項目の位置は、構造体の中のメンバーの順序を必ずしも反映しないことに注意してください。)
マルチレベルの実効特権を持たないプロセスがパス名またはファイル記述子でマルチレベルディレクトリ
(MLD) を指定した場合は、 st_ino に、 i ノード番号として MLD 自体の i ノード番号が返されます。
stat() 関数は、 stat 構造体へ書き込む前に、(『XBD
仕様書』で「ファイル時間更新」の定義に記述されているように) 時間に関係のあるすべてのフィールドを更新します。
構造体メンバー st_mode、 st_ino、 st_dev、 st_uid、 st_gid、 st_atime、 st_ctime、 st_mtime には、このドキュメントで定義されているすべてのファイルタイプに必要な値が入っています。
メンバー st_nlink には、当該ファイルへ接続されているリンクの数が設定されます。
戻り値
正常終了の場合は、0 が返されます。 失敗の場合はエラーの種類を示す値が errno にセットされ、-1
が返されます。
エラー
stat() 関数は、次の場合に失敗します。
| [EACCES] | | path のプレフィックス構成要素に対して検索パーミッションがない場合 |
| [EFAULT] | | buf または path が無効なアドレスを指している場合。 このエラーを確実に検出できるかどうかは、インプリメンテーションに依存しています。 |
| [EIO] | | ファイルシステムから情報を読み取っている最中にエラーが発生した場合 |
| [ELOOP] | | シンボリックリンクが多すぎてパスを特定できない場合 |
| [ENAMETOOLONG] | | 引き数 path で指定されたパス名の長さが {PATH_MAX} バイトを超えているか、またはパス名の構成要素の長さが {NAME_MAX} バイトより長い場合 |
| [ENOENT] | | path の構成要素で指定されたファイルが存在しない場合。
または、パスが空の文字列の場合 |
| [ENOTDIR] | | path プレフィックスにディレクトリではない構成要素がある場合 |
| [EOVERFLOW] | | バイト単位のファイルサイズまたはファイルに割り当てられているブロック数が大きすぎて/
多すぎて、 buf の指す構造体に正しく設定できない場合 |
stat() 関数は、次の場合に失敗することがあります。
| [ENAMETOOLONG] | | シンボリックリンクのパス名を解決する途中で、長さが {PATH_MAX} を超えた場合 |
| [EOVERFLOW] | | st_size またはその他のフィールドが
64 ビット値でなければならないファイルに対して、32 ビットアプリケーションがこの呼び出しを行った場合。
代わりに、 stat64() を使ってください。 |
ネットワーク機能
NFS
リモートからアクセスされるファイルの場合、 st_basemode は st_mode と等しく、 st_acl フィールドと st_aclv フィールドは 0 になります。 st_acl フィールドは HFS ファイルシステムでのみ有効です。 st_aclv フィールドは JFS ファイルシステムでのみ有効です。
警告
アクセス制御リスト
- HFS および JFS ファイルシステム専用
この項目におけるアクセス制御リストの記述は、標準の HP-UX オペレーティングシステムの
HFS および JFS ファイルシステムにだけ適用します。
32 ビットアプリケーションの場合、 st_ino は、64
ビット値を使うファイルシステムでは下位 32 ビットに切り捨てられます。
制約
CD-ROM
st_uid フィールドと st_gid フィールドについては、ディスク上でその情報がファイルに対して指定されていないと、-1
がセットされます。
著者
stat() と fstat() は
AT&T で開発されました。 lstat() はカリフォルニア大学バークレイ校で開発されました。
参照
touch(1), acl(2), chmod(2), chown(2), creat(2), fstat(2),
link(2), lstat(2), mknod(2), pipe(2), read(2), rename(2), setacl(2),
stat64(2), sysfs(2), time(2), truncate(2), unlink(2), utime(2),
write(2), acl(5), aclv(5), stat(5), <sys/stat.h>, <sys/types.h>
標準準拠
stat(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1