プロセスのメモリ情報の取得(C言語)

説明:

現在起動している全てのプロセスのメモリ情報を取得し、結果を表示する。

キーワード:

EnumProcesses, EnumProcessModules, GetModuleBaseName, GetProcessMemoryInfo

サンプルコード:

/* 現在起動しているプロセスのメモリ情報を表示 */
void DispMemInfos()
{
	DWORD ProcessIDs[1000];
	DWORD ProcessNum;
	DWORD ReturnSize;
	DWORD i;
	HANDLE hProcess;
	PROCESS_MEMORY_COUNTERS MemInfo;
	HANDLE hModule;
	char ModuleName[1000];
	BOOL bResult;

	/* プロセスIDの一覧と数を取得 */
	EnumProcesses(ProcessIDs, 1000 * sizeof(DWORD), &ReturnSize);
	ProcessNum = ReturnSize / sizeof(DWORD);

	for(i=0; i<ProcessNum; i++) {
		printf("process id: %x\n", ProcessIDs[i]);

		/* プロセスハンドルの取得 */
		hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessIDs[i]);
		
		if(hProcess != NULL) { /* 取得成功 */
			/* プロセスのメインモジュールのハンドルを取得 */
			bResult = EnumProcessModules(hProcess, &hModule, sizeof(HMODULE), &ReturnSize);
			if(bResult) { /* 取得成功 */
				/* メインモジュールの名前を表示 */
				GetModuleBaseName(hProcess, hModule, ModuleName, 1000);
				printf("\t名前: %s\n", ModuleName);
			}

			/* プロセスのメモリ情報を取得 */
			GetProcessMemoryInfo(hProcess, &MemInfo, sizeof(MemInfo));

			/* 結果の表示 */
			printf("\tページフォールト数: %d\n", MemInfo.PageFaultCount);
			printf("\t最大ワーキングセットサイズ: %d\n", MemInfo.PeakWorkingSetSize);
			printf("\tワーキングセットサイズ: %d\n", MemInfo.WorkingSetSize);
			printf("\t最大ページドプール使用サイズ: %d\n", MemInfo.QuotaPeakPagedPoolUsage);
			printf("\tページドプール使用サイズ: %d\n", MemInfo.QuotaPagedPoolUsage);
			printf("\t最大非ページドプール使用サイズ: %d\n", MemInfo.QuotaPeakNonPagedPoolUsage);
			printf("\t非ページドプール使用サイズ: %d\n", MemInfo.QuotaNonPagedPoolUsage);
			printf("\tページングファイル使用サイズ: %d\n", MemInfo.PagefileUsage);
			printf("\t最大ページングファイル使用サイズ: %d\n", MemInfo.PeakPagefileUsage);

			CloseHandle(hProcess);
		} else {
			printf("\tオープン失敗.\n");
		}
	}
}


(original text:1999/01/06 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。