리눅스 시스템 및 네트워크 프로그래밍/시스템 프로그래밍

리눅스 파일 시스템과 stat() 시스템 콜: 파일 정보 조회 및 관리

ROBL 2025. 2. 3.
728x90
반응형

리눅스에서 파일은 단순한 데이터 저장소가 아니라 다양한 속성과 메타데이터를 포함하는 객체입니다. 파일의 크기, 접근 권한, 수정 시간 등을 확인하려면 stat() 시스템 콜을 사용해야 합니다.

이번 글에서는 리눅스 파일 시스템의 개념과 함께 stat() 시스템 콜을 활용하여 파일 정보를 조회하는 방법을 설명합니다.


1. 리눅스 파일 시스템 개요

리눅스에서 모든 것은 파일로 취급됩니다. 일반 파일, 디렉터리, 심볼릭 링크, 소켓, 디바이스 파일 등 다양한 유형이 존재하며, 각각의 파일은 inode(아이노드) 라는 자료구조로 관리됩니다.

아이노드는 파일의 실제 내용이 저장된 블록을 가리키는 메타데이터 구조이며, 다음과 같은 정보를 포함합니다.

  • 파일 유형 (일반 파일, 디렉터리, 심볼릭 링크 등)
  • 파일 크기
  • 소유자 및 그룹 정보
  • 접근 권한 (퍼미션)
  • 파일 생성, 수정, 접근 시간
  • 링크 개수
  • 디바이스 ID (특정 디바이스 파일의 경우)

2. stat() 시스템 콜 개요

리눅스에서 파일의 메타데이터를 조회하려면 stat() 시스템 콜을 사용합니다.

#include <sys/stat.h>
#include <stdio.h>

int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
  • stat() : 파일 경로를 기반으로 파일 정보를 가져옴
  • fstat() : 파일 디스크립터를 기반으로 파일 정보를 가져옴
  • lstat() : 심볼릭 링크 자체의 정보를 가져옴 (stat()은 링크의 대상 정보를 반환)

struct stat 구조체에는 다음과 같은 파일 정보가 포함됩니다.

struct stat {
    dev_t     st_dev;     /* 파일이 위치한 장치 ID */
    ino_t     st_ino;     /* 아이노드 번호 */
    mode_t    st_mode;    /* 파일 유형 및 접근 권한 */
    nlink_t   st_nlink;   /* 하드 링크 개수 */
    uid_t     st_uid;     /* 소유자 UID */
    gid_t     st_gid;     /* 그룹 GID */
    off_t     st_size;    /* 파일 크기 (바이트 단위) */
    time_t    st_atime;   /* 마지막 접근 시간 */
    time_t    st_mtime;   /* 마지막 수정 시간 */
    time_t    st_ctime;   /* 아이노드 변경 시간 */
};

3. stat() 사용 예제

다음은 stat()을 사용하여 파일 정보를 출력하는 코드입니다.

#include <stdio.h>
#include <sys/stat.h>
#include <time.h>

void print_file_info(const char *filename) {
    struct stat file_stat;
    
    if (stat(filename, &file_stat) == -1) {
        perror("stat");
        return;
    }

    printf("파일 이름: %s\n", filename);
    printf("파일 크기: %ld 바이트\n", file_stat.st_size);
    printf("소유자 UID: %d\n", file_stat.st_uid);
    printf("그룹 GID: %d\n", file_stat.st_gid);
    printf("하드 링크 개수: %ld\n", file_stat.st_nlink);
    printf("마지막 수정 시간: %s", ctime(&file_stat.st_mtime));
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "사용법: %s <파일 이름>\n", argv[0]);
        return 1;
    }

    print_file_info(argv[1]);
    return 0;
}

실행 예시

$ gcc file_stat.c -o file_stat
$ ./file_stat example.txt
파일 이름: example.txt
파일 크기: 2048 바이트
소유자 UID: 1000
그룹 GID: 1000
하드 링크 개수: 1
마지막 수정 시간: Fri Feb 02 15:30:00 2025

4. 파일 유형 확인하기

파일이 일반 파일인지, 디렉터리인지 확인하려면 st_mode 필드를 매크로와 함께 사용합니다.

#include <sys/stat.h>
#include <stdio.h>

void check_file_type(const char *filename) {
    struct stat file_stat;
    
    if (stat(filename, &file_stat) == -1) {
        perror("stat");
        return;
    }

    printf("파일 유형: ");
    if (S_ISREG(file_stat.st_mode)) printf("일반 파일\n");
    else if (S_ISDIR(file_stat.st_mode)) printf("디렉터리\n");
    else if (S_ISLNK(file_stat.st_mode)) printf("심볼릭 링크\n");
    else printf("기타 유형\n");
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "사용법: %s <파일 이름>\n", argv[0]);
        return 1;
    }

    check_file_type(argv[1]);
    return 0;
}

실행 예시

$ ./check_file example.txt
파일 유형: 일반 파일

5. 정리

  • stat() 시스템 콜을 사용하면 파일의 크기, 권한, 소유자, 수정 시간 등을 확인할 수 있습니다.
  • fstat()는 파일 디스크립터를 사용하여 정보를 가져옵니다.
  • lstat()는 심볼릭 링크 자체의 정보를 조회합니다.
  • st_mode 필드를 활용하면 파일 유형을 확인할 수 있습니다.

리눅스 파일 시스템을 다룰 때 stat()를 활용하면 파일 속성을 효율적으로 관리할 수 있습니다. 다음 글에서는 파일 속성을 변경하는 방법을 다루겠습니다.

728x90
반응형

댓글