stat(システム呼び出し)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

statコマンドライン

stat()、 iノードに関するファイル属性を返すUnix システムコールです。stat()のセマンティクスは、オペレーティングシステムによって異なり例として、 Unixコマンドlsはこのシステムコールを使用して、以下を含むファイルに関する情報を取得します。

  • atime:最後のアクセス時刻(ls -lu
  • mtime:最後の変更時刻ls -l
  • ctime:最後のステータス変更の時刻(ls -lc

statバージョン1のUnixに登場しましたこれは、バージョン4にグループ権限が追加され、ファイルサイズが大きくなったことで、変更が必要な数少ない元のUnixシステムコールの1つです。[1]

stat()関数

POSIXおよびその他のUnixライクなオペレーティングシステムにあるCPOSIXライブラリヘッダーsys / stat.hは、関数と、およびと呼ばれる関連関数を宣言します関数は、ファイル属性を返すために使用されるバッファ引数を取ります。成功すると、関数はゼロを返し、エラーが発生すると、-1が返され、errnoが適切に設定されます。 stat()fstat()lstat()struct stat

stat()andlstat()関数はfilename引数を取ります。ファイルがシンボリックリンクの場合、はリンクstat()の最終的なターゲットのlstat()属性を返し、リンク自体の属性を返します。このfstat()関数は、代わりにファイル記述子引数を取り、識別したファイルの属性を返します。

関数ファミリーは、ラージファイルサポートを実装するために拡張されました。stat64()という名前の関数は、64ビット型のファイルサイズを表す構造体の属性lstat64()fstat64()返しますstruct stat64。これにより、関数は2 GiB以上(最大8 EiB)のファイルで機能します。_FILE_OFFSET_BITS マクロが64に定義されている場合、これらの64ビット関数は元の名前で使用できます。

関数は次のように定義されます。

int stat const char * filename struct stat * buf );      
int lstat const char * filename struct stat * buf );      
int fstat int filedesc struct stat * buf );     

統計構造

この構造はsys / stat.hヘッダーファイルで次のように定義されていますが、実装では追加のフィールドを自由に定義できます。[2]

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 ;		
};

st_rdevPOSIX.1は、st_blocksおよびst_blksizeメンバーを必要としません。これらのフィールドは、Single UnixSpecificationのXSIオプションの一部として定義されています。

POSIX.1標準の古いバージョンでは、時間関連のフィールドは、、、およびとして定義されてst_atimeおりst_mtimest_ctimeタイプはでしtime_tた。標準の2008バージョン以降、これらのフィールドは、構造体タイプのst_atimst_mtimおよびにそれぞれ名前が変更されました。これは、この構造体がより高い解像度の時間単位を提供するためです。互換性のために、実装はのメンバーに関して古い名前を定義できますたとえば、はとして定義できます[2]st_ctimtimespectv_secstruct timespecst_atimest_atim.tv_sec

struct stat構造には、少なくとも次のメンバーが含まれます

st_modeフィールドはビットフィールドです。ファイルアクセスモードを組み合わせて、特別なファイルタイプも示しますさまざまなモードフラグとファイルタイプで動作する多くのマクロがあります。

時代への批判

ファイルの読み取りは、最終的にディスク書き込みを必要とする時間を変更します。これは、読み取り専用ファイルシステムと矛盾しているため、批判されています。ファイルシステムキャッシュは、このアクティビティをキャッシュフラッシュごとに1つのディスク書き込みに大幅に減らす可能性があります。

Linuxカーネル開発者のIngoMolnárは、2007年にatimeの概念とパフォーマンスへの影響を公に批判し[4] [5]、2009年には、この批判に対処するrelatimemountオプションがデフォルトになりました。[6] relatimeマウントオプションの背後にある動作は、ほとんどの目的に十分なパフォーマンスを提供し、広く議論されているように、重要なアプリケーションを壊してはなりません。[7]最初、relatimeはatime <mtimeまたはatime <ctimeの場合にのみatimeを更新しました。その後、24時間以上経過した時刻を更新するように変更されたため、tmpwatchそしてDebianの人気カウンター(popcon)は適切に動作します。[8]

Linuxカーネルの現在のバージョンは、 fstabで指定できる4つのマウントオプションをサポートしています

  • strictatime(以前はatime、以前はデフォルト、 2.6.30以降のstrictatime)–常にatimeを更新します。これは、POSIXで定義された動作に準拠しています。
  • relatime( "relative atime"、2.6.20で導入され、2.6.30のデフォルト)–特定の状況でのみatimeを更新します:前のatimeがmtimeまたはctimeより古い場合、または前のatimeが24時間を超える場合過去
  • nodiratime  –ディレクトリのatimeを更新することはありませんが、他のファイルのatimeを更新します
  • noatime  –ファイルまたはディレクトリのatimeを更新しないでください。nodiratimeを意味します; 最高のパフォーマンスですが、互換性は最低です
  • lazytime  –以下に示す特定の状況に応じて時間を更新します

LinuxmacOSSolarisFreeBSD、およびNetBSDの現在のバージョンは、 / etc / fstabでnoatimeマウントオプションをサポートしているため、atimeフィールドは更新されません。時間更新をオフにすると、 POSIXコンプライアンスが破られ、 mbox駆動の「新着メール」通知[9]や、ファイル使用状況監視ユーティリティ、特にtmpwatchなどの一部のアプリケーションが破損します。

OpenBSDnoatimeオプションは、Linuxrelatimeのように動作します[10]

2015年4月12日にリリースされたLinuxカーネルメインラインのバージョン4.0では、新しいマウントオプションlazytimeが導入されました。これにより、POSIXスタイルのatime更新をメモリ内で実行し、同じファイルに対する時間に関係のないI / O操作と一緒にディスクにフラッシュすることができます。同期システムコールの一部が実行されたとき、またはファイルのメモリ内iノードがファイルシステムキャッシュから削除される前に、atime更新もディスクにフラッシュされます。さらに、変更がフラッシュされないままでいる時間の長さを構成することができます。このようにして、lazytimeはPOSIXの互換性を維持しながら、パフォーマンスを向上させます。[11] [12]

ctime

ctimeはもともと作成時間を意味していたと信じたくなります。[13]ただし、初期のUnixには変更と作成の時間がありましたが、後者は、 ctimeを呼び出すC構造体が存在する前のアクセス時間に変更されましたファイルシステムは、第6版のUnixまで、アクセス時間(atime)と変更時間(mtime )だけを保持していました。ctimeタイムスタンプは、第7版のUnixで発生したファイルシステムの再構築に追加され、常にiノードの変更時刻を参照していました。これは、iノードに保存されているファイルメタデータ(ファイルのアクセス許可ファイルの所有権ハードリンクの作成と削除一部の実装では、ctimeはファイルの名前変更の影響を受けます。リンクを作成して(ctimeを更新)、古い名前のリンクを解除して(ctimeを再度更新)名前変更を実装した元のUnixと、最近のLinuxの両方がこれを行う傾向があります。

atimemtimeは異なり、たとえばtouchユーティリティで使用されるように、utime()を使用してctimeを任意の値に設定することはできません。代わりに、utime()が使用される場合、またはファイルへのアクセスによって引き起こされるatimeの更新以外のiノードへのその他の変更の場合、 ctime値は現在の時刻に設定されます。

時間の粒度

  • time_tは、1秒までの正確な時間を提供します。
  • 一部のファイルシステムは、より細かい粒度を提供します。Solaris 2.1は、1992年にUFSでマイクロ秒の解像度を導入し[要出典]、ZFSでナノ秒の解像度を導入しました。[要出典]
  • Linuxカーネル2.5.48以降では、stat構造は3つのファイルタイムスタンプフィールドのナノ秒の解像度をサポートします。これらは、統計構造の追加フィールドとして公開されます。[14] [15]
  • FATファイルシステムでの作成時間の解決は10ミリ秒、書き込み時間の解決は2秒、アクセス時間の解決は1日であるため、アクセス日として機能します。[16]

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#include <sys / types.h> 
#include <pwd.h> 
#include <grp.h> 
#include <sys / stat.h> 

int
main int argc char * argv [])   
{{

	struct  stat sb ; 
	struct  passwd * pwuser ; 
	構造体 グループ* grpnam ; 

	if argc < 2    
	{{
		fprintf stderr "使用法:%s:ファイル... \ n " argv [ 0 ]);  
		終了EXIT_FAILURE );
	}

	for int i = 1 ; i < argc ; i ++         
	{{
		if -1 == stat argv [ i ]、sb ))    
		{{
			perror "stat()" );
			終了EXIT_FAILURE );
		}

		if NULL == pwuser = getpwuid sb。st_uid      
		{{
			perror "getpwuid()" );
			終了EXIT_FAILURE );
		}

		if NULL == grpnam = getgrgid sb。st_gid      
		{{
			perror "getgrgid()" );
			終了EXIT_FAILURE );
		}

		printf "%s:\ n " argv [ i ]); 
		printf " \ t iノード%u \ n " sb。st_ino ; 
		printf " \ t所有者:%u(%s)\ n " sb。st_uid pwuser- > pw_name ;  
		printf " \ tグループ:%u(%s)\ n " sb。st_gid grpnam- > gr_name ;  
		printf " \ t perms:%o \ n " sb .st_mode S_IRWXU | S_IRWXG | S_IRWXO );       
		printf " \ tリンク:%d \ n " sb。st_nlink ; 
		printf " \ tサイズ:%ld \ n " sb。st_size ; / *%lldを使用できます* /  
		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 " );
	}

	0を返す; 
}

参考文献

  1. ^ McIlroy、MD(1987)。Research Unixリーダー:プログラマーマニュアル、1971年から1986年 (PDF)(テクニカルレポート)からの注釈付きの抜粋。CSTR。ベル研究所。139。
  2. ^ a b Stevens&Rago 2013、p。94。
  3. ^ "<sys /stat.h>"Open Group Base Specification Issue 6—IEEE Std 1003.1、2004Editionオープングループ。2004年。
  4. ^ カーネルトラップ: Linux:atimeをrelatimeに置き換える、Jeremy著、2007年8月7日
  5. ^ 昔々、LWN、ジョナサン・コアベット著、2007年8月8日
  6. ^ Linuxカーネル2.6.30、Linuxカーネル初心者
  7. ^ その大規模なファイルシステムスレッド、LWN、Jonathan Corbet、2009年3月31日
  8. ^ Relatime Recap、ヴァレリーオーロラ
  9. ^ http://www.mail-archive.com/[email protected]/msg24912.html "シェルの$ MAILモニターは... atimeに依存し、atime($ MAIL)<mtime($郵便物)"
  10. ^ "mount(2)-OpenBSDのマニュアルページ"openbsd.org2018年4月27日2018年9月26日取得
  11. ^ 「Linuxカーネル4.0、セクション1.5。ファイルのタイムスタンプをより適切に更新するための「lazytime」オプション」kernelnewbies.org2015年5月1日2015年5月2日取得
  12. ^ Jonathan Corbet(2014年11月19日)。「怠惰な時間の紹介」LWN.net 2015年5月2日取得
  13. ^ 「C.ACMUnixペーパーのBSTJバージョン」
  14. ^ "stat(2)-Linuxのマニュアルページ"man7.org 2015年2月27日取得
  15. ^ Andreas Jaeger(2002年12月2日)、ナノ秒の解像度でstat.hを構築、glibcプロジェクトの[email protected]メーリングリストのメールアーカイブ。
  16. ^ MSDN:ファイル時間

外部リンク