8ttyan’s blog

コンピュータ関係の小ネタ

C言語でディスク(HDD)の残り容量を測定してプログラムを自動停止する方法

数値計算でファイルにデータを大量に書き出すと,いっぱいになってマシンがフリーズすることがある. そこで,ディスクの残り容量を取得して,指定MB以下で自動停止させるサブルーチンを作成してみた.

ヘッダーファイル:

//
//  checkDiskSize.h
//  ディスクの容量をチェックして,空き容量が少ないときは終了させるルーチン.
//
//  Created by 8ttyan on 2016/01/31.
//
//

#ifndef ____checkDiskSize__
#define ____checkDiskSize__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

double checkDiskSize(int);
// checkDiskSize(空容量が何MB以下で停止させるかを指定);
// 戻り値は空き容量の割合(0.0-1.0)

#endif /* defined(____checkDiskSize__) */

プログラムファイル:

//
//  checkDiskSize.c
//  
//
//  Created by 8ttyan on 2016/01/31.
//
//

#include "checkDiskSize.h"

double checkDiskSize(int threthold) {
    
    FILE *pipe;         // パイプ用ストリーム
    char results[1024]; // コマンドの実行結果
    int vacant;        // 空き容量をMBで
    char command[1024]="/bin/df -m | /usr/bin/awk '{if($9 == \"/\"){print $4}}'";    // コマンド文字列作成.MB単位で残り容量を得る
    if((pipe = popen(command, "r")) == NULL) {      // コマンド実行
        pclose(pipe);                               // パイプを閉じる
        return -1.0;
    }
    while (fgets(results, 1024, pipe) != NULL);     // 実行結果取得
    
    pclose(pipe);                                   // パイプを閉じる
    sscanf(results, "%d\n", &vacant);               // 文字列を数値に変換
    if (vacant < threthold) {                       // 指定容量を下回った場合
        printf("checkDiskSize() : Less disk capacity! ディスク容量が足りません!\n");   // 標準出力に表示
        fflush(stdout);                             // フラッシュする
        exit(EXIT_FAILURE);                         // プログラムを終了する
    }
    
    return vacant;
    
}

メインファイル内での使用例:

#include <stdio.h>
#include "checkDiskSize.h"

int main() {

    printf("現在のディスク空きは%f%%です.\n", checkDiskSize(1024)*100);   // 空き容量が1024MBを下回る場合にはプログラム終了.下回らない場合には,空き容量の全体に占める割合を表示
    
    return 0;

}

何度もファイルを書き出すプログラムの場合,このような処理をファイル書き出しのたびに行うと,ディスクがパンパンになるのを防ぐ事が出来る.