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;
}
'소프트웨어개발' 카테고리의 다른 글
[ IP-PBX ] 오픈소스 구축(2014.0806) (0) | 2016.01.05 |
---|---|
[UNIX] Socket FAQ (0) | 2016.01.05 |
[ WIN32 ] Windows Sockett sample code (0) | 2016.01.05 |
[ C ] 전처리문 (#define, #if, #ifdef, #ifndef, #defined, .. ) (0) | 2016.01.05 |
[ C ] 소스 IPC_spectrum.c (0) | 2014.08.23 |
댓글