C언어 - 파일 정보 읽기 함수 stat() ,lstat() ,fstat();

IT/C 언어

함수 원형 int stat(const char *path, struct stat * buf);

함수 원형 int lstat(const char *path, struct stat * buf);

함수 원형 int fstat(int fd, struct stat * buf);


stat, lstat, fstat 함수들은 모두 파일 정보를 읽어오는 함수이다.

모두 인트형 정수를 반환하며, fstat함수는 구조체 포인터 buf와 인수형 정수 fd를 인자로 받으며,

stat와 lstat 함수는 문자열 포인터, 구조체 포인터 buf를 인자로 받는다.


각 함수들의 두번째 인자 struct stat를 살펴보면

struct stat {
     dev_t           st_dev;        /*ID of device containing file */

     ino_t            st_ino;          /*inode number*/

     mode_t       st_mode;     /*protection*/

     nlink_t         st_nlink;       /*number of hard links*/

     uid_t            st_uid;          /*user ID of owner*/

     gid_t            st_gid;          /*group ID of owner*/

     dev_t           st_rdev;        /*device ID (if special file)*/

     off_t             st_size;         /*total size, in byte*/

     blksize_t      st_blksize;    /*blocksize for file system I/O*/

     blkcnt_t       st_blocks;     /*number of 512B blocks allocated*/

     time_t;        st_atime;      /*time of last access*/

     time_t;        st_mtime;     /*time of last modification*/

     time_t         st_xtime;       /*time of last status change*/

};

위와 같은 파일 정보들을 담은 구조체 임을 알 수 있다.


위 함수들은 헤더를 선언해 줘야 사용 할 수있는데, 헤더는 다음과 같다.

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>


반환값

-각 함수들의 호출 성공시 0을 반환하며 두번째 인자인 stat 구조체에 파일 정보들로 채워진다.

실패 혹은 에러시 -1을 리턴하고 에러시에 errno 변수에 에러 상태가 set된다.


사용법

함수 각 함수들의 사용법은,


stat과 lstat함수는 첫번째 인자로, 절대경로를 넘겨주어야 하고, 두번째 인자로 stat구조체 주소를 넘겨 주어야 한다.

위와 같이 ""를 사용하여 절대경로를 주어도 되고 문자열을 만들어 주소를 넘겨주어도 된다.


stat, lstat, fstat 함수는 모두 stat함수처럼 파일의 정보를 stat구조체에 채우는 것으로 동일하지만,

lstat함수는 stat와 다르게 한가지 경우를 제외한다.


lstat함수는 path가 심볼릭 링크 파일 경우, 심볼릭 링크 파일에 대한 정보를 구조제체 채운다.

(stat함수는  원본의 정보를 채운다.)


fstat함수는 stat, lstat와 첫 번째 인자가 다른데,

fstat함수는 첫번째 인자로 파일 디스크립터 번호를 인자로 받고 stat와 동일한 기능을 수행한다.

(여기서 파일 디스크립터 번호란, fileopen 등과 같이 open함수를 호출하면 생기는 번호이다.


자세한 사항은 

$man stat, $man lstat, $man fstat 세 가지 명령어 중 1가지를 통해 볼 수있다.