이번 장에서는 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
stat
함수는 지정된 파일에 대한 정보를 담은 stat
구조체를 만들어준다.fstat
함수는 (파일 디스크립터로 지정된) 열려있는 파일에 대한 정보를 제공한다.lstat
은 stat
과 동일하지만, 지정된 파일이 심볼릭 링크라면 심볼릭링크가 가리키는 파일에 대한 정보를 제공하는 대신 심볼릭 링크 자체에 대한 정보를 제공한다.fstatat
함수는 fd
로 지정된 파일로부터의 상대경로로 파일 정보를 가져온다.
fstatat
함수의 flag
인수는 심볼릭 링크를 따라갈것인지 결정할 수 있다(AT_SYMLINK_NOFOLLOW
— 심볼릭 링크를 만나면 따라가지 않고, 링크 자체의 정보를 가져온다).fstatat
은 flag
인자에 따라 stat
이 되기도 lstat
이 되기도 한다.fd
가 AT_FDCWD
라는 특수값일 경우에는 현재 작업 디렉토리를 기준으로 상대경로를 찾는다.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;
일반 파일(Regular file) — 텍스트 파일, 바이너리 파일, 실행가능한 파일을 포함한다.
디렉토리 — 다른 파일들의 이름과 포인터를 가지고 있는 파일이다.
블록 특수 파일(Block special file) — 고정 단위 크기(블록 단위)의 buffered I/O를 지원하는 장치 파일이다. 디스크 드라이브같은 것이 있다.
<aside> 💡 FreeBSD에서는 블록 장치에 대한 지원을 종료했다. 블록 장치는 시스템에서 캐시를 제공한다. 그러나 이 캐시로 인해 쓰기 순서가 조정될 수 있고, 실패시 오류 보고 등에 어려움이 있어 FreeBSD 개발자들은 블록 장치가 안정성이 부족하다고 판단했다. https://docs.freebsd.org/en/books/arch-handbook/driverbasics/#driverbasics-block 참고
</aside>
문자 특수 파일(Character special file) — 가변 길이의 unbuffered I/O를 지원하는 장치 파일이다.
UNIX 시스템의 모든 장치는 문자 장치이거나 블록 장치이다.
FIFO — 프로세스간 통신을 위해 사용된다. 종종 파이프라고 불린다.
소켓 — 네트워크를 통한 IPC를 위해 사용된다.