linux C関数のstat関数


linuxC関数のstat関数
1.関数機能:
ファイル名filenameでファイル情報を取得しbufが指す構造体statに保存する
2.関数プロトタイプ
1)ファンクションヘッダファイル
#include <sys/stat.h>
#include <unistd.h>

2)関数
int stat(const char *file_name, struct stat *buf )

3)戻り値:
実行に成功すると0を返し、失敗すると-1を返し、エラーコードはerrnoに保存されます.
エラーコード:
ENOENTパラメータfile_name指定ファイルは存在しません
ENOTDERパスのディレクトリは存在しますが、本物ではありません.
ELOOPが開こうとしているファイルにマルチシンボル接続の問題があり、上限は16シンボル接続
EFAULTパラメータbufは無効なポインタであり、存在しないメモリ領域を指す
EACCESSファイルへのアクセスが拒否されました
ENOMEMコアメモリ不足
ENAMETOOLONGパラメータfile_nameのパス名が長すぎる数値
4)相関構造体
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_IFMT   0170000            
 S_IFSOCK 0140000    scoket
    S_IFLNK 0120000         
 S_IFREG 0100000         
 S_IFBLK 0060000         
 S_IFDIR 0040000       
 S_IFCHR 0020000         
 S_IFIFO 0010000         

 S_ISUID 04000        (set user-id on execution) 
 S_ISGID 02000        (set group-id on execution) 
 S_ISVTX 01000        sticky 

 S_IRUSR(S_IREAD) 00400                
 S_IWUSR(S_IWRITE)00200                
 S_IXUSR(S_IEXEC) 00100                

 S_IRGRP 00040                      
 S_IWGRP 00020                      
 S_IXGRP 00010                      

 S_IROTH 00004                       
 S_IWOTH 00002                       
 S_IXOTH 00001                       

Linuxでは、これらのタイプをチェックするマクロ定義が定義されています.
    S_ISLNK (st_mode)              
    S_ISREG (st_mode)            
    S_ISDIR (st_mode)           
    S_ISCHR (st_mode)               
    S_ISBLK (s3e)                  
    S_ISSOCK (st_mode)      socket

3.stat,fstat,lstat関数の違いと同じ点
1)原型
#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はシンボル接続で参照されるファイルの情報ではなく、シンボル接続に関する情報を返します.