NAME
statvfs, fstatvfs - 파일 시스템 통계 얻기
SYNOPSIS
#include <sys/statvfs.h>
int statvfs(const char *restrict path, struct statvfs *restrict buf);
int fstatvfs(int fd, struct statvfs *buf);
DESCRIPTION
statvfs() 함수는 마운트 된 파일 시스템에 대한 정보를 반환한다. path는 마운트 된 파일 시스템 내 임의 파일의 경로명이다. buf는 대략 다음처럼 정의돼 있는 statvfs 구조체의 포인터다.
struct statvfs {
unsigned long f_bsize; /* 파일 시스템 블록 크기 */
unsigned long f_frsize; /* 단편 크기 */
fsblkcnt_t f_blocks; /* f_frsize 단위의 fs 크기 */
fsblkcnt_t f_bfree; /* 유휴 블록 수 */
fsblkcnt_t f_bavail; /* 비특권 사용자를 위한
유휴 블록 수 */
fsfilcnt_t f_files; /* 아이노드 수 */
fsfilcnt_t f_ffree; /* 유휴 아이노드 수 */
fsfilcnt_t f_favail; /* 비특권 사용자를 위한
유휴 아이노드 수 */
unsigned long f_fsid; /* 파일 시스템 ID */
unsigned long f_flag; /* 마운트 플래그 */
unsigned long f_namemax; /* 파일명 최대 길이 */
};
타입 fsblkcnt_t와 fsfilcnt_t는 <sys/types.h>에 정의돼 있다. 둘 모두 예전에는 unsigned long이었다.
f_flag 필드는 이 파일 시스템을 마운트 할 때 사용한 여러 옵션들을 나타내는 비트 마스크이다. 다음 비트를 0개 이상 담는다.
ST_MANDLOCK- 파일 시스템 상에서 강제적 락킹을 허용한다. (fcntl(2) 참고.)
ST_NOATIME- 접근 시간을 갱신하지 않는다. mount(2) 참고.
ST_NODEV- 파일 시스템 상에서 장치 특수 파일에 대한 접근을 불허한다.
ST_NODIRATIME- 디렉터리 접근 시간을 갱신하지 않는다. mount(2) 참고.
ST_NOEXEC- 파일 시스템 상에서 프로그램 실행을 불허한다.
ST_NOSUID- 파일 시스템 상의 실행 파일에 대해 exec(3)에서 set-user-ID 및 set-group-ID 비트를 무시한다.
ST_RDONLY- 파일 시스템이 읽기 전용으로 마운트 돼 있다.
ST_RELATIME- mtime/ctime에 따라서 atime을 갱신한다. mount(2) 참고.
ST_SYNCHRONOUS- 쓰기를 파일 시스템으로 즉시 동기화한다. (open(2)의
O_SYNC설명 참고.)
모든 파일 시스템에서 반환 구조체의 모든 필드들에 유의미한 값이 있는지 여부는 명세돼 있지 않다.
fstatvfs()는 디스크립터 fd가 가리키는 열린 파일에 대해서 같은 정보를 반환한다.
RETURN VALUE
성공 시 0을 반환한다. 오류 시 -1을 반환하며 오류를 나타내도록 errno를 설정한다.
ERRORS
EACCES- (
statvfs())path의 경로 선두부의 어느 요소에 대해 탐색 권한이 거부되었다. (path_resolution(7)도 참고.) EBADF- (
fstatvfs())fd가 유효한 열린 파일 디스크립터가 아니다. EFAULTbuf나path가 유효하지 않은 주소를 가리키고 있다.EINTR- 호출이 시그널에 의해 중단되었다. signal(7) 참고.
EIO- 파일 시스템에서 읽기를 하던 중 I/O 오류가 발생했다.
ELOOP- (
statvfs())path를 변환하는 동안 너무 많은 심볼릭 링크를 만났다. ENAMETOOLONG- (
statvfs())path가 너무 길다. ENOENT- (
statvfs())path가 가리키는 파일이 존재하지 않는다. ENOMEM- 사용 가능한 커널 메모리가 충분하지 않다.
ENOSYS- 파일 시스템에서 이 호출을 지원하지 않는다.
ENOTDIR- (
statvfs())path의 경로 선두부의 한 요소가 디렉터리가 아니다. EOVERFLOW- 일부 값이 너무 커서 반환 구조체로 표현할 수 없다.
ATTRIBUTES
이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.
| 인터페이스 | 속성 | 값 |
|---|---|---|
statvfs(), fstatvfs() |
스레드 안전성 | MT-Safe |
CONFORMING TO
POSIX.1-2001, POSIX.1-2008.
f_flag 필드의 ST_NOSUID 및 ST_RDONLY 플래그만 POSIX.1에 명세돼 있다. 다른 필드들의 정의를 얻으려면 _GNU_SOURCE를 정의해야 한다.
NOTES
리눅스 커널에 있는 시스템 호출 statfs(2) 및 fstatfs(2)가 이 라이브러리 호출을 뒷받침한다.
glibc 버전 2.13 전의 statvfs()에서는 /proc/mounts에 나오는 마운트 옵션들을 훑어서 f_flag 필드의 비트들을 채웠다. 하지만 리눅스 2.6.36부터 기반 시스템 호출 statfs(2)가 f_flags 필드를 통해 필요한 정보를 제공해 주며, 그래서 glibc 버전 2.13부터는 statvfs() 함수에서 /proc/mounts를 훑는 대신 그 필드의 정보를 이용하게 된다.
다음 호출의 glibc 구현에서는 path를 인자로 statvfs()를 호출해서 반환된 f_frsize, f_frsize, f_bsize 필드를 각각 사용한다.
pathconf(path, _PC_REC_XFER_ALIGN);
pathconf(path, _PC_ALLOC_SIZE_MIN);
pathconf(path, _PC_REC_MIN_XFER_SIZE);
SEE ALSO
2021-03-22