GETRUSAGE(2)

名前
getrusage - 資源の使用量を取得する

書式
#include <sys/time.h>
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);

説明
getrusage() は who の資源 (resource) の使用量を返す。 who には以下のいずれか一つを指定できる。

RUSAGE_SELF
    呼び出したプロセスの資源使用量、 そのプロセス内の全スレッドが使用している資源の合計を返す。

RUSAGE_CHILDREN
    呼び出したプロセスの子プロセスのうち、 終了して待ち状態にある全プロセスが使用している資源使用量の統計を返す。 これらの統計情報には、孫プロセスやその子孫のプロセスのうち、 削除待ちのものが使用している資源も含まれる。

RUSAGE_THREAD (Linux 2.6.26 以降)
    呼び出したスレッドに関する資源使用量の統計を返す。 <sys/resource.h> からこの定数の定義を得るためには、 ((どのヘッダーファイルをインクルードするよりも前に) 機能検査マクロ _GNU_SOURCE を定義しなければならない。

資源使用量は usage が指す構造体に格納されて返される。 構造体は以下の形式である。

    struct rusage {
        struct timeval ru_utime; /* 使用されたユーザー CPU 時間 */
        struct timeval ru_stime; /* 使用されたシステム CPU 時間 */
        long   ru_maxrss;        /* RAM 上に存在する仮想ページのサイズ
                                   (resident set size) の最大値 */
        long   ru_ixrss;         /* 共有メモリーの合計サイズ */
        long   ru_idrss;         /* 非共有データの合計サイズ */
        long   ru_isrss;         /* 非共有スタックの合計サイズ */
        long   ru_minflt;        /* ページの再利用 (ソフトページフォルト) */
        long   ru_majflt;        /* ページフォールト (ハードページフォルト) */
        long   ru_nswap;         /* スワップ */
        long   ru_inblock;       /* ブロック入力操作 */
        long   ru_oublock;       /* ブロック出力操作 */
        long   ru_msgsnd;        /* 送信された IPC メッセージ */
        long   ru_msgrcv;        /* 受信された IPC メッセージ */
        long   ru_nsignals;      /* 受信されたシグナル */
        long   ru_nvcsw;         /* 意図したコンテキスト切り替え */
        long   ru_nivcsw;        /* 意図しないコンテキスト切り替え */
    };

すべてのフィールドがサポートされているわけではない。 メンテナンスされていないフィールドには、 カーネルが 0 を設定する (メンテナンスされていないフィールドは、 他のシステムとの互換性のために提供されており、 いつか Linux でもサポートされるかもしれない)。 各フィールドの詳細は以下の通りである。

ru_utime
    ユーザーモードでの実行で消費された合計時間。 timeval 構造体 (秒とミリ秒) で表現される。

ru_stime
    カーネルモードでの実行で消費された合計時間。 timeval 構造体 (秒とミリ秒) で表現される。

ru_maxrss (Linux 2.6.32 以降)
    使用された resident set size の最大値 (キロバイト単位)。 RUSAGE_CHILDREN の場合には、プロセスツリーの resident set size の最大値ではなく、 最も大きい子プロセスの resident set size となる。

ru_ixrss (メンテナンスされていない)
    このフィールドは現在のところ Linux では未使用である。

ru_idrss (メンテナンスされていない)
    このフィールドは現在のところ Linux では未使用である。

ru_isrss (メンテナンスされていない)
    このフィールドは現在のところ Linux では未使用である。

ru_minflt
    I/O 動作なしで発生したページフォルトの回数。 再割り当てを待っているページリストからページフレームを「回収」 (reclaim) することで、 I/O 動作を避けることができる。

ru_majflt
    I/O 動作を必要とするページフォルトの回数。

ru_nswap (メンテナンスされていない)
    このフィールドは現在のところ Linux では未使用である。

ru_inblock (Linux 2.6.22 以降)
    ファイルシステムが入力を実行する必要があった回数。

ru_oublock (Linux 2.6.22 以降)
    ファイルシステムが出力を実行する必要があった回数。

ru_msgsnd (メンテナンスされていない)
    このフィールドは現在のところ Linux では未使用である。

ru_msgrcv (メンテナンスされていない)
    このフィールドは現在のところ Linux では未使用である。

ru_nsignals (メンテナンスされていない)
    このフィールドは現在のところ Linux では未使用である。

ru_nvcsw (Linux 2.6 以降)
    自分のタイムスライスが完了する前にプロセスが自発的にプロセッサを解放して行われたコンテキストスイッチの回数 (通常はリソースが利用可能になるのを待つために行われる)。

ru_nivcsw (Linux 2.6 以降)
    優先度が自分より高いプロセッサが実行可能になったか、現在のプロセスが自分のタイムスライスを超過したことにより行われたコンテキストスイッチの回数。

返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。

エラー

EFAULT
    usage がアクセス可能なアドレス空間の外を指している。

EINVAL
    who が無効である。

属性
この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース | 属性 | 値
getrusage() | Thread safety | MT-Safe

準拠
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. POSIX.1 は getrusage() を規定しているが、規定しているフィールドは ru_utime と ru_stime だけである。

RUSAGE_THREAD は Linux 固有である。

注意
execve(2) の前後でリソース使用量の指標は保持される。

今日では <sys/time.h> をインクルードする必要はないが、 インクルードしておけば移植性が増す。 (実際 struct timeval は <sys/time.h> で定義されている。)

2.6.9 より前のバージョンの Linux カーネルでは、 SIGCHLD の処理が SIG_IGN に設定されていると、 子プロセスのリソース使用量が RUSAGE_CHILDREN で返される値に自動的に含められる。 しかし POSIX.1-2001 では、これを明確に禁止している。 この準拠していなかった点は、Linux 2.6.9 以降で改正された。

このページの最初で示した構造体の定義は 4.3BSD Reno のものである。

古いシステムでは、 getrusage() と同様の目的を持つ関数 vtimes() が提供されていた。後方互換性のため、glibc (バージョン 2.32 まで) でも vtimes() を提供している。全ての新しいアプリケーションでは getrusage() を使用すべきである。

proc(5) にある /proc/[pid]/stat の説明も参照のこと。

関連項目
clock_gettime(2), getrlimit(2), times(2), wait(2), wait4(2), clock(3)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。