본문 바로가기
C

[C/C++] stat(2), lstat(2), fstat(2) 파일 정보 확인 함수 사용법

by Junk_Seo 2024. 3. 11.
반응형

stat(2), lstat(2), fstat(2) 함수 원형

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *pathname, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
  • 파일 이름 또는 파일 디스크립터를 입력으로 받아 해당 파일의 정보를 얻는 함수입니다.
  • man 페이지에서 확인하기 위해선 "man 2 stat"을 사용해야 stat(2) 내용을 확인할 수 있습니다.
    • stat() : symbolic link 파일을 입력으로 받으면 원본 파일의 정보를 확일할 수 있습니다.
    • lstat() : symbolic link 파일을 입력으로 받으면 해당 파일의 정보를 확일할 수 있습니다.
    • fstat() : 파일 디스크립터를 입력으로 받 해당 파일의 정보를 확일할 수 있습니다.

파라미터

  • pathname
    • 정보를 얻고자 하는 파일의 절대 경로 또는 상대 경로
  •  fd
    • 정보를 얻고자 하는 파일의 파일 디스크립터
  • statbuf
    • 파일의 정보를 저장할 구조체
      struct stat {
          dev_t     st_dev;     /* 디바이스 번호 */
          ino_t     st_ino;     /* inode 번호 */
          mode_t    st_mode;    /* 파일의 종류 및 접근권한 */
          nlink_t   st_nlink;   /* hardlink 된 횟수 */
          uid_t     st_uid;     /* 소유자의 사용자 아이디 */
          gid_t     st_gid;     /* 소유자의 그룹 아이디 */
          dev_t     st_rdev;    /* 디바이스 아이디 (특수 파일인 경우) */
          off_t     st_size;    /* 파일의 크기(bytes) */
          blksize_t st_blksize; /* 블록 크기 */
          blkcnt_t  st_blocks;  /* 512바이트 블록 갯수 */
          time_t    st_atime;   /* 최종 접근 시간 */
          time_t    st_mtime;   /* 최종 수정 시간 */
          time_t    st_ctime;   /* 최종 상태 변경 시간 */
      };​​
    • st_mode와 매크로
      S_ISREG(statbuf.st_mode)  : 일반 파일 여부
      S_ISDIR(statbuf.st_mode)  : 디렉토리 여부
      S_ISCHR(statbuf.st_mode)  : character device 여부
      S_ISBLK(statbuf.st_mode)  : block device 여부
      S_ISFIFO(statbuf.st_mode) : FIFO 여부
      S_ISLNK(statbuf.st_mode)  : symbolic link 여부
      S_ISSOCK(statbuf.st_mode) : socket 여부
      
      S_IFMT   : 파일 유형의 전체의 비트 마스크 값
      S_IFSOCK : 소켓
      S_IFLNK  : 심볼릭 링크
      S_IFREG  : 일반 파일
      S_IFBLK  : 블록 디바이스
      S_IFDIR  : 디렉터리 파일
      S_IFCHR  : 문자 디바이스
      S_IFIFO  : FIFO, Pipe 파일

반환값

  • 0 : 성공
  • -1 : 실패, 오류 내용은 errno 전역 변수에 설정됩니다.

예제

  • sample
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <time.h>
    #include <errno.h>
    
    int showFileInfo(const char *pathname)
    {
    	struct stat st;
    	
    	if (0 != stat(pathname, &st))
    	{
    		printf("파일 정보 획득 실패 [%s]\n", strerror(errno));
    		return -1;
    	}
    
        printf("파일 타입 :                 ");
        switch (sb.st_mode & S_IFMT)
        {
        case S_IFBLK:
            printf("block device\n");
            break;
        case S_IFCHR:
            printf("character device\n");
            break;
        case S_IFDIR:
            printf("directory\n");
            break;
        case S_IFIFO:
            printf("FIFO/pipe\n");
            break;
        case S_IFLNK:
            printf("symlink\n");
            break;
        case S_IFREG:
            printf("regular file\n");
            break;
        case S_IFSOCK:
            printf("socket\n");
            break;
        default:
            printf("unknown?\n");
            break;
        }
        
        printf("I-노드 번호 :               %ld\n", (long) sb.st_ino);
        printf("접근 권한 :                 %lo (octal)\n", (unsigned long) sb.st_mode);
        printf("하드링크 수 :               %ld\n", (long) sb.st_nlink);
        printf("소유자 :                    UID=%ld   GID=%ld\n", (long) sb.st_uid, (long) sb.st_gid);
        printf("블록 크기 :                 %ld bytes\n",         (long) sb.st_blksize);
        printf("파일 크기 :                 %lld bytes\n",        (long long) sb.st_size);
        printf("블록 개수 :                 %lld\n",              (long long) sb.st_blocks);
        printf("마지막 상태 변경 시간 :      %s", ctime(&sb.st_ctime));
        printf("마지막 접근 시간 :           %s", ctime(&sb.st_atime));
        printf("마지막 수정 시간 :           %s", ctime(&sb.st_mtime));
    
        return 0;
    }
    
    int main(int argc, char **argv)
    {
    
        showFileInfo("./sample_file");
    
        return 0;
    }​


반응형