
statコマンドラインstat()は、ファイル(ディレクトリなどの特殊ファイルを含む)に関するメタデータをファイルシステムから照会するUnixシステムコールです。メタデータには、タイプ、サイズ、所有者、パーミッション、タイムスタンプなど、多くのフィールドが含まれます。
例えば、このlsコマンドはタイムスタンプを取得するためにこのシステムコールを使用します。
ls -l)ls -lu)ls -lc)stat()バージョン 1 Unixに登場しました。これは、バージョン 4でグループ権限とより大きなファイルサイズが追加されたことにより変更された、数少ないオリジナルの Unixシステム コールの1 つです。[ 1 ]
少なくとも2004年以降、 Linuxでは同名のシェルコマンドが利用可能になり、コマンドラインインターフェースを介してシステムコールの機能を利用できるようになりました。[ 2 ]stat
POSIXおよびその他のUnix ライクなオペレーティングシステムにある C POSIX ライブラリ ヘッダー sys/stat.h は、および関連する関数を宣言しています。stat()
int stat ( const char * path , struct stat * buf ); int lstat ( const char * path , struct stat * buf ); int fstat ( int filedesc , struct stat * buf );struct stat各関数は、指定されたファイルに関する情報を読み込むバッファへのポインタを受け取ります。システムコールの一般的な動作と同様に、各関数は成功した場合は0を返し、失敗した場合はerrnoに失敗状態を示す値を設定し、-1を返します。
および関数は、ファイルを指定するパス引数を受け取りますstat()。パスがシンボリックリンクを識別する場合、はリンク先の属性を返し、 はリンク自体の属性を返します。関数は、パスの代わりにファイル記述子引数を受け取り、識別したファイルの属性を返します。lstat()stat()lstat()fstat()
ライブラリが拡張され、大容量ファイルに対応しました。関数はstat64()、64ビットサイズをサポートするバッファに情報をロードしlstat64()、 2 GiB以上(最大8 EiB)のファイルを扱うことができます。マクロが64として定義されている場合、64ビット関数は元の名前で使用できます。fstat64()struct stat64 _FILE_OFFSET_BITS
メタデータ構造はsys/stat.hヘッダーで定義されています。以下に基本フィールドを示しますが、実装では追加のフィールドを含めることができます。[ 3 ]
struct stat { mode_t st_mode ; ino_t st_ino ; dev_t st_dev ; dev_t st_rdev ; nlink_t st_nlink ; uid_t st_uid ; gid_t st_gid ; off_t st_size ; struct timespec st_atim ; struct timespec st_mtim ; struct timespec st_ctim ; blksize_t st_blksize ; blkcnt_t st_blocks ; };POSIX.1ではst_rdev、、st_blocksおよびst_blksizeメンバーは必須ではありません。これらのフィールドは、Single Unix SpecificationのXSIオプションの一部として定義されています。
POSIX.1 標準の旧バージョンでは、時間関連フィールドはst_atime、st_mtimeおよびとして定義されst_ctime、型はでしたtime_t。2008 年版の標準以降、これらのフィールドは、それぞれ、およびに名前が変更されst_atim、st_mtim型st_ctimは struct となりましtimespecた。これは、この構造体がより高い解像度の時間単位を提供するためです。互換性のために、実装では、tv_secのメンバーを使用して古い名前を定義できますstruct timespec。たとえば、st_atimeはとして定義できますst_atim.tv_sec。[ 3 ]
分野には以下が含まれます。
st_dev –ファイルを含むデバイスの識別子st_ino – iノード番号st_mode ファイルアクセスモードと特殊なファイルタイプを含むビットフィールド。Unixパーミッションを参照。st_nlink –ハードリンクの参照数st_uid –所有者のユーザー識別子st_gid –所有者のグループ識別子st_rdev –デバイス識別子(特殊ファイルの場合)st_size –ファイルの合計サイズ(バイト単位)st_atime –最終アクセス時刻st_mtime –最終更新日時st_ctime –最終ステータス変更時刻st_blksize –ファイルシステムI/Oの推奨ブロックサイズ。これはシステムとファイルシステムのタイプの両方に依存する可能性がある[ 4 ]st_blocks –割り当てられるブロック数DEV_BSIZE(通常は512 バイトの倍数)。以下のCプログラムは、コマンドライン経由で渡された各ファイルに関するメタデータを、stat()関数を使用してシステムから情報を取得することで報告します。
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/stat.h> #include <sys/types.h>int main ( int argc , char * argv []) { struct stat sb ;for ( int i = 1 ; i < argc ; i ++ ) { if ( stat ( argv [ i ], & sb ) == -1 ) { perror ( "stat failed" ); exit ( EXIT_FAILURE ); }printf ( " % s: \n " , argv [ i ] ); printf ( " \t inode: %u \ n " , sb.st_ino ); printf ( " \t perms: %o \n " , sb.st_mode & ( S_IRWXU | S_IRWXG | S_IRWXO )); printf ( " \t links: %d \n " , sb.st_nlink ) ; printf ( " \t size : %ld \ n " , sb.st_size ) ; printf ( " \t atime: %s" , ctime ( & sb.st_atim.tv_sec ) ) ; printf ( " \ t mtime : % s " , ctime ( & sb.st_mtim.tv_sec ) ) ; printf ( " \t ctime : %s" , ctime ( & sb.st_ctim.tv_sec ) ) ; printf ( " \n " ) ; }return 0 ; }