이번 장에서는 struct stat 구조체의 내용을 보면서 파일 시스템의 여러 속성을 살펴보고 이 속성들을 변경하는 시스템 콜에 대해서도 몇 가지 알아본다.

stat, fstat, fstatat, lstat

#include <sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrict buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *restrict pathname, struct stat *restrict buf);
int fstatat(int fd, const char *resrict pathname,
            struct stat *restrict buf, int flag);
// 반환: 성공 시 0, 에러 시 -1

struct stat 구조체

구현에 따라 이 구조체의 세부 사항은 달라질 수 있지만, 대체로 이런 항목들을 포함한다.

struct stat {
  mode_t          st_mode;    /* 파일 타입 & mode (퍼미션) */
  ino_t           st_ino;     /* i-node 번호 (serial number) */
  dev_t           st_dev;     /* 장치 번호 (file system) */
  dev_t           st_rdev;    /* 특수 파일에 대한 장치 번호 */
  nlink_t         st_nlink;   /* 링크의 수 */
  uid_t           st_uid;     /* 소유자의 user Id*/
  gid_t           st_gid;     /* 소유 group Id */
  off_t           st_size;    /* (일반 파일인 경우) 바이트로 나타낸 크기 */
  struct timespec st_atim;    /* 마지막 접속 시각 */
  struct timespec st_mtim;    /* 마지막 수정 시각 */
  struct timespec st_ctim;    /* file status가 변경된 시각 */
  blksize_t       st_blksize; /* best I/O block size */
  blkcnt_t        st_blocks;  /* number of disk blocks allocated */
};

여기서 timespec 구조체는 초와 나노초로 나타낸 시간을 기록한다. 이 구조체는 다음과 같은 필드를 가지고 있다.

time_t tv_sec;
long   tv_nsec;

파일 타입

  1. 일반 파일(Regular file) — 텍스트 파일, 바이너리 파일, 실행가능한 파일을 포함한다.

  2. 디렉토리 — 다른 파일들의 이름과 포인터를 가지고 있는 파일이다.

  3. 블록 특수 파일(Block special file) — 고정 단위 크기(블록 단위)의 buffered I/O를 지원하는 장치 파일이다. 디스크 드라이브같은 것이 있다.

    <aside> 💡 FreeBSD에서는 블록 장치에 대한 지원을 종료했다. 블록 장치는 시스템에서 캐시를 제공한다. 그러나 이 캐시로 인해 쓰기 순서가 조정될 수 있고, 실패시 오류 보고 등에 어려움이 있어 FreeBSD 개발자들은 블록 장치가 안정성이 부족하다고 판단했다. https://docs.freebsd.org/en/books/arch-handbook/driverbasics/#driverbasics-block 참고

    </aside>

  4. 문자 특수 파일(Character special file) — 가변 길이의 unbuffered I/O를 지원하는 장치 파일이다.

    UNIX 시스템의 모든 장치는 문자 장치이거나 블록 장치이다.

  5. FIFO — 프로세스간 통신을 위해 사용된다. 종종 파이프라고 불린다.

  6. 소켓 — 네트워크를 통한 IPC를 위해 사용된다.