서버에서 데몬(백그라운드 프로세스,  서비스)로 동작하면서 시스템의 변화를 확인하기 위해서 사용했던 내용으로 리눅스에서 c로 간단하게 구현할 수 있는 방법을 소개한다.

     

    --- 시스템 관리 함수 관련 글타래 -------------------------------

    1. 시스템 메모리 사용량 확인 : meminfo() 또는 sysinfo()

    2. 프로세스의 리소스 정보 확인 : getrusage()

    >> 3. 파일시스템(저장소) 정보 확인 : fstatvfs()

     --------------------------------------------------------------------

      embeddedclub.net에서 조회수가 많이있는것으로 보아 언젠가는 독자께 도움이 될수 있을 거라 판단하여 게시물을 이동하였다. 


    3. fstatvfs() (fstatvfs64(), statvfs(), statvfs64())

      아래의 두 함수는 struct statvfs 유형의 구조에 대한 포인터를 사용하여 해당 구조체를 채운다. 명명된 파일의 읽기, 쓰기 또는 실행 권한은 필요하지 않지만 파일로 이어지는 경로에 나열된 모든 디렉터리는 검색이 가능해야 한다.

     

    - fstatvfs() 함수는 지정된 파일 설명자가 참조하는 파일을 포함하는 파일 시스템에 대한 정보 수집.

    - statvfs() 함수는 지정된 경로 이름이 참조하는 파일을 포함하는 파일 시스템에 대한 정보를 수집.

    - fstatvfs64() 및 statvfs64() 함수는 더 큰 파일 시스템에 대한 정보를 보고할 수 있는 struct statvfs64에 대한 포인터를 사용한다는 점을 제외하고 fstatvfs() 및 statvfs() 함수와 동일.

     

    3.1. sysnopsis 

    1) 함수원형

    #include <sys/statvfs.h>
    
    int fstatvfs(int fildes, struct statvfs *buf);
    int statvfs(const char *path, struct statvfs *buf);
    int fstatvfs64(int fildes, struct statvfs64 *buf);
    int statvfs64(const char *path, struct statvfs64 *buf);

     

    2) 구조체 

    struct statvfs {
        unsigned long  f_bsize;  
        unsigned long  f_frsize;   
        fsblkcnt_t     f_blocks;   
        fsblkcnt_t     f_bfree;    
        fsblkcnt_t     f_bavail;   
        fsfilcnt_t     f_files;    
        fsfilcnt_t     f_ffree;    
        fsfilcnt_t     f_favail;   
        unsigned long  f_fsid;    
        unsigned long  f_flag;   
        unsigned long  f_namemax;  
    };

     

    2.2. Description

    1) 구조체 멤버정보

      sysinfo() 는 전체적인 시스템 통계 정보를 가져오기 위해서 사용한다. 가져온 정보는 struct sysinfo 에 채워진다.
    struct sysinfo 는 다음과 같은 멤버변수를 가진다.

    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;      : 파일명 최대 길이

     

    2) 반환값

      성공시 0, 실패하면 -1 (이외 여러 오류가 발생할 수 있으며, 일반적으로 EFAULT(errno 코드)가 발생.

      - 기타 발생가능 오류

        EACCES : 탐색거부
        EBADF : 유효하지 않은 파일 디스크립트
        EFAULT : 유효하지 않은 buf나 path 지정

        EINTR : 시그널에 의해 중단
        EIO : I/O 오류

        및 여러 오류가 발생가능하다. 

     

      - f_flag 필드는 아래의 여러 정보를 나타낸다. (전반적인 내용은 fcntl(2). mount(2)등을 참고한다)

        ST_MANDLOCK : 파일 시스템 상에서 강제적 락킹을 허용. 
        ST_NOATIME : 접근 시간 비 갱신.  
        ST_NODEV : 파일 시스템 상에서 장치 특수 파일에 대한 접근을 불허.
        ST_NODIRATIME : 디렉터리 접근 시간 비 갱신.  
        ST_NOEXEC : 파일 시스템 상에서 프로그램 실행을 불허.
        ST_NOSUID : 파일 시스템 상의 실행 파일에 대해 exec(3)에서 set-user-ID 및 set-group-ID 비트를 무시.
        ST_RDONLY : 파일 시스템이 읽기 전용으로 마운트 돼 있는경우.
        ST_RELATIME : mtime/ctime에 따라서 atime을 갱신.
        ST_SYNCHRONOUS : 쓰기를 파일 시스템으로 즉시 동기화.

     

     

      아쉽게도 샘플이 기존 게시물에 포함되어있지 않았다. 필자의 기억으로는 프로세스 메모리 사용량을 확인한 경험이 있다고 기억이 됨에 따라 크게 무리 없이 사용하였던것으로 기억한다. 이러한 함수도 있다 정도만 기억하고 있다가 필요시 찾아서 활용하는 정도로만 기록해둔다.

     

    도움이 되었길 바란다.

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기