linux stat関数解説(整理)


stat関数解説
ヘッダファイル:   

 #include <sys/stat.h>
#include <unistd.h>
定義関数:   

int stat(const char *file_name, struct stat *buf);
関数の説明:   
ファイル名filenameでファイル情報を取得し、bufで指す構造体statに保存する。
戻り値:     
実行に成功すれば0に戻り、失敗は-1に戻り、エラーコードはerrnoに保存されます。
エラーコード:
    ENOENT         パラメータfile_name指定のファイルは存在しません。
    ENOTDIR        パス中のディレクトリは存在しますが、本物のディレクトリではありません。
    ELLOOP          開くファイルには多すぎる符号接続問題があります。上限は16シンボル接続です。
    EFAULT         パラメータbufは無効ポインタで、存在できないメモリ空間を指します。
    EACCESS        ファイルにアクセスするときに拒否されました。
    ENOMEM         コアメモリ不足
    ENAMETOOLONG   パラメータfile_nameのパス名が長すぎます。

#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main() {
  struct stat buf;
  stat("/etc/hosts", &buf);
  printf("/etc/hosts file size = %d
", buf.st_size); }
------------------------------------------

struct stat {
  dev_t     st_dev;    //       
  ino_t     st_ino;    //  
  mode_t    st_mode;   //           
  nlink_t    st_nlink;   //           ,        1
  uid_t     st_uid;    //  ID
  gid_t     st_gid;    // ID
  dev_t     st_rdev;   //(    )         ,       
  off_t     st_size;   //     (    )
  unsigned long st_blksize;  //   (     I/O      )
  unsigned long st_blocks;  //  
  time_t    st_atime;   //        
  time_t    st_mtime;   //        
  time_t    st_ctime;   //        (   )
};
前述のst_modeは以下のいくつかの状況を定義しています。
    S_IFRMT   0170000    ファイルタイプのビットカバー
    S_IFSOCK 0140000    scoket
    S_IF LNK 0120000     シンボル接続
    S_IF REG 0100 0000     一般ファイル
    S_IFBLK 0060000     ブロック装置
    S_IFRDIR 0040000     目次
    S_IF CHR 0020000     文字装置
    S_IIF O 001 0000     先入れ先出し
    S_ISUID 0400     ファイルの(set user-ind on execution)ビット
    S_ISGID 02000     ファイルの(set group-ind on execution)ビット
    S_ISVTX 01000     書類のsticky位
    S_IREUS(S_)IREAD)00400     ファイル所有者に読み取り可能な権限があります。
    S_IWUSR(S_IWRITE)00200     ファイル所有者に書き込み可能な権限があります。
    S_IXUSR(S_IEXEC)00100     ファイル所有者に実行可能な権限があります。
    S_IGRP 00040             ユーザグループに読み取り可能な権限があります。
    S_IWGRP 00020             ユーザグループに書き込み可能権限があります。
    S_IXGRP 00010             ユーザグループに実行可能権限があります。
    S_IRLT 00004             他のユーザーが読み取り可能な権限を持っています。
    S_IWOTH 00002             他のユーザーが書き込み可能な権限があります。
    S_IXOTH 00001             他のユーザーは実行可能権限があります。
    上記のファイルタイプは、POSIXにおいて、これらのタイプを検査するマクロ定義を定義している。
    S_ISLNK(st_モデル    シンボル接続かどうかを判断する
    S_ISREG(st_モデル    一般ファイルかどうか
    S_ISDIR(st_モデル    ディレクトリかどうか
    S_ISCHR(st_モデル    文字装置ファイルかどうか
    S_ISBLK(s 3 e)        先进のために先に出ますか?
    S_ISSOCKモデル   socketですか
    もし一つのディレクトリがsticky位(S_ISVTX)は、このディレクトリの下にあるファイルは、そのファイルの所有者、このディレクトリの所有者またはrootによってのみ削除または改名できるという意味です。
------------------------------------------

struct statfs {
  long  f_type;     //      
  long  f_bsize;     //   
  long  f_blocks;    //   
  long  f_bfree;     //    
  long  f_bavail;    //   
  long  f_files;     //     
  long  f_ffree;     //      
  fsid_t f_fsid;      //    id
  long  f_namelen;    //        
  long  f_spare[6];   //spare for later
};
stat、fstat、lstat関数(UNIX)

#include<sys/types.h>
#include<sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
ファイル名を提供し、ファイルの対応する属性を取得します。普通はファイルが開いていない時にこのように操作します。

int fstat(int filedes, struct stat *buf);
ファイル記述子からファイルに対応する属性を取得します。ファイルを開いてからこのように操作します。

int lstat(const char *restrict pathname, struct stat *restrict buf);
接続ファイル
3つの関数の戻り:成功すれば0、エラーがあれば-1です。
pathnameを与えられたstat関数は、この名前付きファイルに関する情報構造を返します。fstat関数は、ディスクリプタfiledesで開かれたファイルに関する情報を得ます。lstat関数はstatと似ていますが、名前が付けられたファイルがシンボル接続である場合、lstatはシンボル接続で参照されたファイルの情報ではなく、シンボル接続に関する情報を返します。
第二のパラメータはポインタであり、我々が提供すべき構造を指す。これらの関数はbufが指す構造を記入します。この構造の実際の定義は実装によって異なるかもしれないが、その基本的な形式は以下の通りである。

struct stat{
mode_t st_mode;  /*file tpye &mode (permissions)*/
ino_t st_ino;   /*i=node number (serial number)*/
dev_t st_rdev;  /*device number for special files*/
nlink_t st_nlink; /*number of links*/
uid_t  st_uid; /*user id of owner*/
gid_t  st_gid; /*group ID of owner*/
off_t  st_size; /*size in bytes for regular files*/
time_t st_atime; /*time of last access*/
time_t st_mtime; /*time of last modification*/
time_t st_ctime; /*time of last file status change*/
long st_blksize; /*best I/O block size */
long st_blocks; /*number of 512-byte blocks allocated*/
};
   なお、最後の2つを除いて、他の各メンバーは基本システムデータタイプである。この構造の各メンバーを説明して、ファイルの属性を理解します。
stat関数を使用すると最も多いのは、ls-lコマンドかもしれません。これで、ファイルに関するすべての情報が得られます。
1関数はファイル(一般ファイル、ディレクトリ、パイプ、socket、文字、ブロック()の属性を取得します。
関数プロトタイプ

#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
ファイル名を提供し、ファイルの対応する属性を取得します。

int fstat(int filedes, struct stat *buf);
ファイル記述子からファイルに対応する属性を取得します。

int lstat(const char *restrict pathname, struct stat *restrict buf);
ファイルの説明コマンドを接続して、ファイルのプロパティを取得します。
2ファイルに対応する属性

struct stat {
    mode_t   st_mode;    //       ,  ,   
    ino_t   st_ino;    //inode   
    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;   //          
   };
上記の関数で、構造体を返してファイルの情報を保存します。
以上は小编が皆さんに绍介したlinux stat関数の解说です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに皆さんに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。