1. ホーム

S_ISREG およびその他いくつかの共通マクロ .

2022-02-15 21:44:04
<スパン stat関数で説明します。

<スパン テーブルのヘッダーファイルです。#include <sys/stat.h>
#include <unistd.h>
関数: int stat(const char *file_name, struct stat *buf)を定義します。
関数の説明 ファイル情報をファイル名で取得し、bufで参照されるstat構造体に保存する関数です。
戻り値:実行に成功した場合は0、失敗した場合は-1、エラーコードはerrnoに格納される
エラーコードを表示します。
ENOENTパラメータfile_nameで指定されたファイルが存在しません。
ENOTDIRパスのディレクトリは存在するが、実際のディレクトリでない
ELOOP 開こうとするファイルのシンボリックリンクが多すぎる。最大で16個のシンボリックリンクがある。
EFAULT パラメータ buf が存在し得ないメモリ空間への無効なポインタである。
ファイルへの EACCESS アクセスが拒否された
ENOMEM コアメモリ不足
ENAMETOOLONG パラメーター file_name のパス名が長すぎます。

<スパン <スパン

<スパン int stat(const char *file_name,struct stat *buf)。
int fstat(int filedes,struct stat *buf)。
stat 構造体は、ファイル /usr/include/sys/stat.h で定義されています。
  struct stat finfo;
  stat( sFileName, &finfo );
  int size = finfo.st_size;
  構造体Stat { <未定義
  mode_t st_mode; /ファイル対応モード、ファイル、ディレクトリなど。
  ino_t st_ino; //i-nodeのノード番号
  dev_t st_dev; //デバイス番号
  dev_t st_rdev; //特殊なデバイス番号
  nlink_t st_nlink; //ファイルへの接続数
  uid_t st_uid; //ファイルの所有者
  gid_t st_gid; //ファイル所有者に対応するグループ
  off_t st_size; // 共通ファイル、ファイルのバイト数に対応する。
  time_t st_atime; // ファイルが最後にアクセスされた時間
  time_t st_mtime; //ファイルの内容が最後に変更された時間
  time_t st_ctime; //ファイルの状態(属性)が変化した時間
  blksize_t st_blksize; //ファイルの内容に対応するブロックサイズ
  blkcnt_t st_blocks; //ファイルの中身に対応するブロック数
  };
statはどのファイルが開かれていないかを判断するために使用され、fstatはどのファイルが開かれているかを判断するために使用されます。最もよく使われる属性はst_modeです。この属性で、与えられたファイルが通常のファイルなのか、ディレクトリ、リンクなどなのかを判断することができます。これを判断するために、以下のマクロを使用することができます。
S_ISLNK(st_mode):リンクであるかどうか。

<スパン S_ISREGが通常ファイルであるかどうか。

<スパン S_ISDIR はディレクトリか?

<スパン S_ISCHR がキャラクタデバイスであるかどうか。

<スパン S_ISBLKがブロックデバイスであるかどうか

<スパン S_ISFIFOがFIFOファイルであるかどうか。

<スパン S_ISSOCK が SOCKET ファイルであるかどうか。 

<スパン <スパン


<スパン 使用方法

// 構造体を定義する
struct stat m;

// ユーザーが入力したファイル名(ディレクトリかどうかを判断するために使用される)。
char *filename;

int a;
int n = stat(filename,&m).
a = S_ISDIR(m.st_mode).

aが真であればディレクトリであり、そうでなければそうでない。