Stat System CallLinuxチュートリアル

Stat System Call Linux Tutorial



Linuxカーネルによって提供されるシステムコールは、glibcを介してCプログラミング言語で公開されます。システムコールが使用されている場合、OSと通信しており、OSは、システムコール関数に返されるパラメーター(戻り値)を介して通信します。

統計システム呼び出し:

statシステムコールは、ファイルがいつアクセスされたかを確認するなど、ファイルのステータスを確認するためのLinuxのシステムコールです。 stat()システム呼び出しは、実際にはファイル属性を返します。 iノードのファイル属性は基本的にStat()関数によって返されます。 iノードにはファイルのメタデータが含まれています。 iノードには、ファイルのタイプ、ファイルのサイズ、タイムスタンプであるファイルへのアクセス(変更、削除)の日時、ファイルのパス、ユーザーIDとグループID、ファイルのリンクが含まれます。 、およびファイルコンテンツの物理アドレス。







iノードにはstat()システム呼び出しに必要なすべてのデータが含まれており、iノードテーブルに保存されるのはファイルのインデックス番号であると言えます。ファイルを作成するたびに、そのファイルのiノード番号が作成されます。 statシステムコールを使用すると、システムテーブルを表示できます。



C Statシステムコールの構文:

Cプログラミング言語でstatシステム呼び出しを使用するには、次のヘッダーファイルをインクルードする必要があります。



#含む

Statは、ファイルのステータスを取得するために使用されます。 C statシステムコールの構文は、すべてのオペレーティングシステムで同じであるとは限りません。 Linuxでは、statシステム呼び出しの構文は次のとおりです。





int((const char * 構造体*buf)。

intでの関数の戻り型。関数が正常に実行された場合、エラーがある場合は0が返され、-1が返されます。

ここ const char * path ファイルの名前を指定します。ファイルのパスがシンボリックリンクの場合は、ファイル名の代わりにリンクを指定する必要があります。



次に、関数には、ファイルに関するデータまたは情報が格納されているstat構造があり、次の名前のポインターを使用します。 buf、 これはパラメータとして渡され、呼び出しの実行中に入力され、呼び出し後にユーザーが読み取ることができます。

統計構造:

ヘッダーファイルで定義されている統計構造には、次のフィールドが含まれています。

構造体
{{
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_tst_size;
構造体timspec st_atim;
構造体timspec st_mtim;
構造体timspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

説明:

  1. st_dev: これは、現在ファイルが存在するデバイスのIDです。
  2. st_rdev: このフィールドは、特定のファイルが特定のデバイスを表すことを示します。
  3. st_ino: これは、ファイルのiノード番号またはシリアル番号です。インデックス番号であるため、すべてのファイルで一意である必要があります
  4. st_size: st_sizeは、ファイルのサイズ(バイト単位)です。
  5. st_atime: これは、ファイルが最後にアクセスされた時刻または最近の時刻です。
  6. st_ctime: これは、ファイルのステータスまたはアクセス許可が変更された最近の時刻です。
  7. st_mtime: これは、ファイルが変更された最近の時刻です。
  8. st_blksize: このフィールドは、ファイルごとに異なる可能性のあるI / Oファイルシステムの推奨ブロックサイズを示します。
  9. st_blocks: このフィールドは、512バイトの倍数でブロックの総数を示します。
  10. st_nlink: このフィールドは、ハードリンクの総数を示します。
  11. st_uid: このフィールドはユーザーIDを示します。
  12. st_gid: このフィールドはグループIDを示します。
  13. st_mode: これは、ファイルのアクセス許可を示し、ファイルのモードを示します。 st_modeフィールドに定義する必要のあるフラグは次のとおりです。
フラグ 説明 フラグ値
S_IFMT ファイルのモード値を取得するために使用されるビットマスク 0170000
S_IFSOCK ソケットのファイル定数 0140000
S_IFLINK シンボリックリンクのファイル定数 0120000
S_IFREG 通常のファイルのファイル定数 0100000
S_IFBLK ブロックファイルのファイル定数 0060000
S_IFDIR ディレクトリファイルのファイル定数 0040000
S_IFCHR 文字ファイルのファイル定数 0020000
S_IFIFO fifoのファイル定数 0010000
S_ISUID ユーザーIDビットを設定する 0004000
S_ISGID グループIDビットを設定します 0002000
S_ISVTX 共有テキストを示すスティッキービット 0001000
S_IRWXU 所有者のアクセス許可(読み取り、書き込み、実行) 00700
S_IRUSR 所有者の読み取り権限 00400
S_IWUSR 所有者の書き込み権限 00200
S_IXUSR 所有者の実行権限 00100
S_IRWXG グループのアクセス許可(読み取り、書き込み、実行) 00070
S_IRGRP グループの読み取り権限 00040
S_IWGRP グループの書き込み権限 00020
S_IXGRP グループの実行権限 00010
S_IRWXO 他のユーザーのアクセス許可(読み取り、書き込み、実行) 00007
S_IROTH 他の人の許可を読む 00004
S_IWOTH 他の人の書き込み権限 00002
S_IXOTH 他の人のアクセス許可を実行する 00001

Statシステムコールの使用方法:

次の例は、Linux、UbuntuでCプログラミング言語でstatシステム呼び出しを使用する方法を示しています。

例1:

次のコードでは、ファイルのモードを見つけます。

コード:

#含む
#含む
int主要(()。
{{
// stat構造体へのポインタ
構造体状態ファイル;

// statシステム呼び出し
(('stat.c' sfile)。;

// st_mode(stat structのデータメンバー)にアクセスする
printf (('st_mode =%o'sfile。st_mode)。;
戻る 0;
}

プログラムをコンパイルして実行すると、次のようになります。

このコードでは、statシステム呼び出しでファイルの名前を渡し、次にsfileであるstat構造体へのポインターを渡しました。次に、stat structへのポインターを使用して、printfステートメントを使用してファイルのモードを表示するst_modeにアクセスします。

ヘッダーファイルが使用されるため、statシステム呼び出しを使用できます。ヘッダーファイルは標準の入出力ライブラリファイルであるため、Cコードでprintfまたはscanfを使用できます。

例2:

次のコードでは、statシステム呼び出しを使用してファイルに関する情報を取得します。

コード:

#含む
#含む
#含む
#含む

空所sfile((char constファイル名[])。;

int主要(()。{{
ssize_t読み取り;
char*バッファ= 0;
size_tbuf_size= 0;

printf (('チェックするファイルの名前を入力します。NS')。;
読んだ=getline((バッファ buf_sizestdin)。;

もしも ((読んだ<=0 )。{{
printf (('getlineが失敗しましたNS')。;
出口 ((1)。;
}

もしも ((バッファ[読んだ-1] == 'NS')。{{
バッファ[読んだ-1] = 0;
}

intNS=開いた((バッファO_RDONLY)。;
もしも((NS==-1)。{{
printf (('ファイルが存在しませんNS')。;
出口 ((1)。;
}
そうしないと{{
sfile((バッファ)。;
}
自由 ((バッファ)。;
戻る 0;
}

空所sfile((char constファイル名[])。{{

構造体状態ファイル;

もしも((((ファイル名、&sfile)。==-1)。{{
printf (('エラーが発生しましたNS')。;
}

// statstructのデータメンバーへのアクセス
printf (('NSファイルst_uid%dNS'sfile。st_uid)。;
printf (('NSファイルst_blksize%ldNS'sfile。st_blksize)。;
printf (('NSファイルst_gid%dNS'sfile。st_gid)。;
printf (('NSファイルst_blocks%ldNS'sfile。st_blocks)。;
printf (('NSファイルst_size%ldNS'sfile。st_size)。;
printf (('NSファイルst_nlink%uNS'((署名なし int)。sfile。st_nlink)。;
printf (('NSファイルパーミッションユーザーNS')。;
printf ((((sfile。st_mode S_IRUSR)。 'NS''-')。;
printf ((((sfile。st_mode S_IWUSR)。 'の''-')。;
printf ((((sfile。st_mode S_IXUSR)。 'NS''-')。;
printf (('NS')。;
printf (('NSファイルパーミッショングループNS')。;
printf ((((sfile。st_mode S_IRGRP)。 'NS''-')。;
printf ((((sfile。st_mode S_IWGRP)。 'の''-')。;
printf ((((sfile。st_mode S_IXGRP)。 'NS''-')。;
printf (('NS')。;
printf (('NSファイルパーミッションその他NS')。;
printf ((((sfile。st_mode S_IROTH)。 'NS''-')。;
printf ((((sfile。st_mode S_IWOTH)。 'の''-')。;
printf ((((sfile。st_mode S_IXOTH)。 'NS''-')。;
printf (('NS')。;
}

出力:

上記のCコードでは、ファイル名を入力しており、ファイルが存在しない場合はプログラムの実行を停止します。これは、次の画像に示されています。

ファイルが存在する場合は、ファイルの名前を渡した関数sfile(n)が呼び出されます。関数内では、まずStatシステムコールを使用しました。stat()が-1を返した場合、メッセージが出力されてプログラムの実行が停止するように、エラーが発生する必要があります。

次に、printfステートメントで、関数名とドット区切り文字を使用して、のデータメンバーにアクセスしました。 stat struct

次に、ファイルのモードについて、st_modeのマクロまたはフラグにアクセスしました。ここでは、論理積と演算子を使用して、それぞれのモードを出力します。指定したファイル(ユーザーが入力したファイル名)のユーザー、グループなどの権限を確認しました。

これにより、Cプログラミング言語からのstatシステム呼び出しを使用して、OSカーネルからファイルに関する情報を取得する方法を確認できます。ご不明な点がございましたら、コメント欄からお気軽にお問い合わせください。