이번 장에서는 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를 위해 사용된다.