プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

プロセスのI/O操作情報を取得

2008年07月08日 17時10分00秒 | プロセス関連

プロセスのI/O操作情報を取得するにはGetProcessIoCounters()関数を利用します。(戻る)

  1. プロセスのハンドルを開く(OpenProcess)
  2. プロセスのメモリ情報を取得(GetProcessIoCounters)
  3. プロセスのハンドルを閉じる(CloseHandle)

プロセスを開くときにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があります。

取得可能なI/O操作情報

  1. I/O読み取り
  2. I/O書き込み
  3. I/Oその他
  4. I/O読み取りバイト数
  5. I/O書き込みバイト数
  6. I/Oその他バイト数

タスクマネージャでの表現です。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD   dwDesiredAccess,    // アクセス・フラグ
    BOOL    bInheritHandle,     // ハンドルの継承オプション
    DWORD   dwProcessId         // プロセス識別子
);

BOOL CloseHandle(
    HANDLE  hObject             // オブジェクトのハンドル
);

BOOL GetProcessIoCounters(
    HANDLE          hProcess,           // プロセスのハンドル
    PIO_COUNTERS   lpIoCounters        // 構造体のポインタ
);

構造体

typedef struct _IO_COUNTERS {
    ULONGLONG   ReadOperationCount;     // I/O読み取り
    ULONGLONG   WriteOperationCount;    // I/O書き込み
    ULONGLONG   OtherOperationCount;    // I/Oその他
    ULONGLONG   ReadTransferCount;      // I/O読み取りバイト数
    ULONGLONG   WriteTransferCount;     // I/O書き込みバイト数
    ULONGLONG   OtherTransferCount;     // I/Oその他バイト数
} IO_COUNTERS, *PIO_COUNTERS;

サンプル

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <Psapi.h>      // Psapi.Lib

// メイン関数
int main( int argc, char *argv[] )
{
    DWORD dwProcessID = GetCurrentProcessId();
    HANDLE hProcess;
    IO_COUNTERS ioc;
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
        if ( GetProcessIoCounters(hProcess,&ioc) ){
            printf( TEXT("プロセスID          :%lu\n"), dwProcessID );
            printf( TEXT("プロセス・ハンドル  :0x%p\n"), hProcess );
            printf( TEXT("I/O 読み取り        :%I64u\n"), ioc.ReadOperationCount );
            printf( TEXT("I/O 書き込み        :%I64u\n"), ioc.WriteOperationCount );
            printf( TEXT("I/O その他          :%I64u\n"), ioc.OtherOperationCount );
            printf( TEXT("I/O 読み取りバイト数:%I64uバイト\n"), ioc.ReadTransferCount );
            printf( TEXT("I/O 書き込みバイト数:%I64uバイト\n"), ioc.WriteTransferCount );
            printf( TEXT("I/O その他バイト数  :%I64uバイト\n"), ioc.OtherTransferCount );
        }
        else{
            printf( TEXT("%lu:GetProcessIoCounters()関数のエラーです。\n"), GetLastError() );
        }
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}
  • ヘッダファイルとしてPsapi.hをインクルードします。
  • インポートライブラリとしてPsapi.Libをリンクします。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« プロセスのメモリ情報を取得 | トップ | プロセスの最大/最小ワーキ... »
最新の画像もっと見る

コメントを投稿

プロセス関連」カテゴリの最新記事