C言語

【C言語】第10章第8回:システム監視ツールの開発

本記事では、C言語を用いてシステムのCPU使用率やメモリ使用率を監視する簡単なツールを作成します。システム情報を取得する方法や、定期的な監視の仕組みを学びます。

0. 記事の概要

この記事を読むメリット

  • システムプログラミングの基礎理解:システムリソース情報の取得方法を学べます。
  • ツール開発の実践経験:監視ツールの開発を通じて、リアルタイム性や効率性を考える力を養います。
  • 応用力の向上:本ツールを基に、より高度なモニタリングツールを開発する基盤を得られます。

この記事で学べること

  • システム情報取得の基本(CPU、メモリ)
  • 定期的な監視と出力方法
  • ツールの設計とコード構造の理解

1. システム監視ツールの基本設計

1.1 システム監視ツールの機能

このツールでは以下の基本機能を実装します。

  • CPU使用率の監視
  • メモリ使用率の監視
  • 一定間隔での情報表示

1.2 必要なプログラム構造

プログラムは以下の主要部分で構成されます。

  • システム情報の取得処理
  • 監視データのフォーマットと出力
  • 一定間隔での処理繰り返し

2. コード例と詳細解説

2.1 基本コード例

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

void getCPUUsage() {
    FILE *fp;
    char buffer[128];
    fp = popen("top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\\([0-9.]*\\)%* id.*/\\1/' | awk '{print 100 - $1\"%\"}'", "r");
    if (fp == NULL) {
        printf("CPU使用率を取得できませんでした。\\n");
        return;
    }

    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("CPU使用率: %s", buffer);
    }
    pclose(fp);
}

void getMemoryUsage() {
    FILE *fp;
    char buffer[128];
    fp = popen("free -m | awk 'NR==2{printf \"メモリ使用率: %.2f%%\\n\", $3*100/$2 }'", "r");
    if (fp == NULL) {
        printf("メモリ使用率を取得できませんでした。\\n");
        return;
    }

    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }
    pclose(fp);
}

int main() {
    while (1) {
        printf("=== システム監視ツール ===\\n");
        getCPUUsage();
        getMemoryUsage();
        sleep(5);
    }
    return 0;
}
動作解説
  1. CPU使用率取得:`getCPUUsage`関数でLinuxコマンドを使用してCPU使用率を取得します。
  2. メモリ使用率取得:`getMemoryUsage`関数でLinuxコマンドを使用してメモリ使用率を取得します。
  3. 定期的な出力:`main`関数で`sleep`を使用して5秒ごとに監視結果を出力します。

3. 練習問題

以下の課題に挑戦して、システム監視ツールを拡張してみましょう。

  1. ネットワーク使用率を監視する機能を追加してください。
  2. 監視データをログファイルに記録する機能を追加してください。
  3. CPUおよびメモリ使用率が特定のしきい値を超えた場合に警告を表示する機能を実装してください。

4. 練習問題の解答と解説

問2の解答例

// ログファイルへの記録
void logData(const char *filename, const char *data) {
    FILE *file = fopen(filename, "a");
    if (file) {
        fprintf(file, "%s\\n", data);
        fclose(file);
    } else {
        printf("ログファイルを開けませんでした。\\n");
    }
}

この関数を利用して、CPUやメモリ使用率をログファイルに記録できます。

5. まとめ

本記事では、C言語を用いて基本的なシステム監視ツールを実装しました。さらに高度な機能を追加して、実用的なモニタリングツールを開発してみましょう。