본문 바로가기
소프트웨어개발

[ Linux/C/C++] df명령, FileSystem 용량

by 보이드메인 2016. 1. 5.


Linux환경에서 프로그래밍을 할 때

어떤 파일 시스템(window에서는 어느 드라이브)에 사용중인 용량이 얼마이고,

남은 용량이 얼마인지를 구해야 할 때가 있다.

아래의 특정 Filesystem의 남은 용량 구하는 예제 함수를 이용하면 된다.

setmntent함수와 getmntemt함수를 이용하여 인자로 주어진 패스, 즉 특정 filesystem의

남은 용량을 구한다.

여러개의 NAS를 연동하는 서버에서 /nas 혹은 /nas2의 남은 용량을 구하기 위해 아래의 함수를 사용했다.



#include <sys/vfs.h> // for statfs

#include <mntent.h> // for mntent

/*

struct mntent

{

char *mnt_fsname; // Device or server for filesystem.

char *mnt_dir; // Directory mounted on.

char *mnt_type; // Type of filesystem: ufs, nfs, etc.

char *mnt_opts; // Comma-separated options for fs.

int mnt_freq; // Dump frequency (in days).

int mnt_passno; // Pass number for `fsck'.

};

struct statfs {

long f_type; // type of filesystem (see below)

long f_bsize; // optimal transfer block size

long f_blocks; // total data blocks in file system

long f_bfree; // free blocks in fs

long f_bavail; // free blocks avail to non-superuser

long f_files; // total file nodes in file system

long f_ffree; // free file nodes in fs

fsid_t f_fsid; // file system id

long f_namelen; // maximum length of filenames

long f_spare[6]; // spare for later

};

*/

unsigned long GetMountFileSystemAvailableSize(char *szPath)

{

FILE *s_mount_table;

struct mntent *s_mount_entry;

struct statfs s_status_fs;

unsigned long free_size = 0;

s_mount_table = setmntent("/proc/mounts", MNTOPT_RO);

if (s_mount_table != ((FILE *) 0)) {

do {

s_mount_entry = getmntent(s_mount_table);

if (s_mount_entry == ((struct mntent *) 0)) break;

if ((s_mount_entry->mnt_dir == ((char *) 0)) || (s_mount_entry->mnt_fsname == ((char *) 0))) continue;

if (statfs((char *) s_mount_entry->mnt_dir, (struct statfs *) (&s_status_fs)) != 0) continue;

if (s_status_fs.f_blocks < 0l) continue;

if ( strcmp(s_mount_entry->mnt_dir, szPath) == 0 ) {

free_size = (((unsigned long) s_status_fs.f_bavail)/1024) * (((unsigned long) s_status_fs.f_bsize)/1024);

break;

}

} while(1);

(void)endmntent(s_mount_table);

}

return free_size;

}

댓글