statfs()는 마운트(:12)된 파일 시스템에 대한 정보를 반환한다.
path는 마운트된 파일 시스템내 파일의
경로 이름이다. 파일 시스템의 정보는 buf가
가르키는 공간에 채워진다. statfs구조체는
다음과 같이 정의되어 있다.
struct statfs {
long f_type; /* 파일 시스템 타입(아래에서 보여준다) */
long f_bsize; /* 최적화된 전송 블럭 크기 */
long f_blocks; /* 파일 시스템내 총 데이터 블럭들 */
long f_bfree; /* 파일 시스템내 여유 블럭들 */
long f_bavail; /* 비-슈퍼 유저를 위한 여유 블럭들 */
long f_files; /* 파일 시스템내 총 파일 노드들 */
long f_ffree; /* 파일 시스템내 여유 파일 노드들 */
fsid_t f_fsid; /* 파일 시스템 ID */
long f_namelen; /* 파일 이름의 최대 길이 */
long f_spare[6]; /* 나중을 위한 여유분 */
};
1장. statfs(2)
파일 시스템 정보를 가져온다.
1.1절. 사용법
1.2절. 설명
statfs()는 마운트(:12)된 파일 시스템에 대한 정보를 반환한다. path는 마운트된 파일 시스템내 파일의 경로 이름이다. 파일 시스템의 정보는 buf가 가르키는 공간에 채워진다. statfs구조체는 다음과 같이 정의되어 있다.
struct statfs { long f_type; /* 파일 시스템 타입(아래에서 보여준다) */ long f_bsize; /* 최적화된 전송 블럭 크기 */ long f_blocks; /* 파일 시스템내 총 데이터 블럭들 */ long f_bfree; /* 파일 시스템내 여유 블럭들 */ long f_bavail; /* 비-슈퍼 유저를 위한 여유 블럭들 */ long f_files; /* 파일 시스템내 총 파일 노드들 */ long f_ffree; /* 파일 시스템내 여유 파일 노드들 */ fsid_t f_fsid; /* 파일 시스템 ID */ long f_namelen; /* 파일 이름의 최대 길이 */ long f_spare[6]; /* 나중을 위한 여유분 */ };fstatfs()는 열린 파일지정자fd를 사용한다는 것을 제외하고는 statfs()와 동일하다.
1.3절. 반환값
성공시 0이 리턴되고, 에러가 발생하면 -1이 리턴된다.
1.4절. 에러
statfs():
path의 경로 요소가 디렉토리가 아니다.
path가 너무 길다.
탐색 허가권이 path경로 요소에서 거부되었다.
너무 많은 상징 연결을path해석시에 만났다.
buf나path가 유효하지 않은 주소를 가리키고 있다.
파일 시스템을 읽거나 쓰는 동안 I/O 에러가 발생했다.
이용할 수 있는 커널 메모리가 충분하지 않다.
path파일 시스템이 statfs를 지원하지 않는다.
fd는 유효한 파일지정자가 아니다.
buf가 유효하지 않은 주소를 가리키고 있다.
path파일 시스템이 statfs를 지원하지 않는다.
파일 시스템을 읽거나 쓰는 동안 I/O 에러가 발생했다.
1.5절. 예제
/* * 파일시스템 정보 얻어오기 * /proc/mounts 정보와 statfs를 이용한다. */ #include <stdio.h> #include <string.h> #include <libgen.h> #include <sys/vfs.h> #include <sys/stat.h> #include <sys/types.h> const char *MMOUNT = "/proc/mounts"; struct f_size { long blocks; long avail; }; typedef struct _mountinfo { FILE *fp; // 파일 스트림 포인터 char devname[80]; // 장치 이름 char mountdir[80]; // 마운트 디렉토리 이름 char fstype[12]; // 파일 시스템 타입 struct f_size size; // 파일 시스템의 총크기/사용율 } MOUNTP; MOUNTP *dfopen() { MOUNTP *MP; // /proc/mounts 파일을 연다. MP = (MOUNTP *)malloc(sizeof(MOUNTP)); if(!(MP->fp = fopen(MMOUNT, "r"))) { return NULL; } else return MP; } MOUNTP *dfget(MOUNTP *MP) { char buf[256]; char *bname; char null[16]; struct statfs lstatfs; struct stat lstat; int is_root = 0; // /proc/mounts로 부터 마운트된 파티션의 정보를 얻어온다. while(fgets(buf, 255, MP->fp)) { is_root = 0; sscanf(buf, "%s%s%s",MP->devname, MP->mountdir, MP->fstype); if (strcmp(MP->mountdir,"/") == 0) is_root=1; if (stat(MP->devname, &lstat) == 0 || is_root) { if (strstr(buf, MP->mountdir) && S_ISBLK(lstat.st_mode) || is_root) { // 파일시스템의 총 할당된 크기와 사용량을 구한다. statfs(MP->mountdir, &lstatfs); MP->size.blocks = lstatfs.f_blocks * (lstatfs.f_bsize/1024); MP->size.avail = lstatfs.f_bavail * (lstatfs.f_bsize/1024); return MP; } } } rewind(MP->fp); return NULL; } int dfclose(MOUNTP *MP) { fclose(MP->fp); } int main() { MOUNTP *MP; if ((MP=dfopen()) == NULL) { perror("error"); return 1; } while(1) { while(dfget(MP)) { printf("%-14s%-20s%10lu%10lu\n", MP->mountdir, MP->devname, MP->size.blocks, MP->size.avail); } printf("=========================\n\n"); sleep(1); } }1.6절. 참고문헌
SMS 프로그램 제작
디스크 정보 가져오기
Recent Posts
Archive Posts
Tags