首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

已知一个进程的pid,怎么获得某时刻该进程占用的CPU、内存、虚拟内存、句柄数等信息

2012-03-03 
已知一个进程的pid,如何获得某时刻该进程占用的CPU、内存、虚拟内存、句柄数等信息!已知一个进程的pid,如何获

已知一个进程的pid,如何获得某时刻该进程占用的CPU、内存、虚拟内存、句柄数等信息!
已知一个进程的pid,如何获得某时刻该进程占用的CPU、内存、虚拟内存、句柄数等信息!   用c或Java   实现。或给出c代码

[解决办法]
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#ifndef STATUS_INFO_LENGTH_MISMATCH
#define STATUS_INFO_LENGTH_MISMATCH ((DWORD )0xC0000004L)
#endif

typedef struct
{
FILETIME ftCreationTime;
DWORD dwUnknown1;
DWORD dwStartAddress;
DWORD dwOwningPID;
DWORD dwThreadID;
DWORD dwCurrentPriority;
DWORD dwBasePriority;
DWORD dwContextSwitches;
DWORD dwThreadState;
DWORD dwWaitReason;
DWORD dwUnknown2[5];
} THREADINFO, *PTHREADINFO;

#pragma warning( disable:4200 ) // Zero sized array
typedef struct
{
DWORD dwRelativeOffset; //相对偏移量
DWORD dwThreadCount; //线程数目
DWORD dwUnknown1[6];
FILETIME pfCreateTime;
DWORD dwUnknown2[5];
WCHAR* pszProcessName; //不带路径的名称
DWORD dwBasePriority; //优先级
DWORD dwProcessID; //进程ID
DWORD dwParentProcessID; //父进程ID
DWORD dwHandleCount; //句柄数目
DWORD dwUnknown3;
DWORD dwUnknown4;
DWORD dwVirtualBytesPeak;
DWORD dwTotalVirtualBytes;
DWORD dwPageFaults;
DWORD dwWorkingSetPeak;
DWORD dwTotalWorkingSet; //占用物理内存大小
DWORD dwPeakPagedPoolUsagePages;
DWORD dwTotalPagedPoolUsagePages;
DWORD dwPeakNonPagedPoolUsagePages;
DWORD dwTotalNonPagedPoolUsagePages;
DWORD dwPageFileBytesPeak;
DWORD dwPrivateBytes;
DWORD dwPageFileBytes;
DWORD dwUnknown7[4];
THREADINFO ti[0];
} _PROCESSINFO, *PPROCESSINFO;
#pragma warning( default:4200 )

DWORD (__stdcall *NtQuerySystemInformation )(ULONG,PVOID,ULONG,ULONG);

void ShowPI(void)
{
PBYTE pbyInfo = NULL;
PPROCESSINFO pProcessInfo;
DWORD dwSize = 0x4000;
WCHAR *pname;

if (!NtQuerySystemInformation)
NtQuerySystemInformation=(DWORD (__stdcall*)(ULONG,PVOID,ULONG,ULONG))

GetProcAddress(GetModuleHandle( "ntdll.dll "), "NtQuerySystemInformation ");

pbyInfo=(PBYTE) malloc(dwSize);

if (pbyInfo)
{
for(;;)
{
memset(pbyInfo,0,dwSize);


if(NtQuerySystemInformation(5,pbyInfo,dwSize,0)!=STATUS_INFO_LENGTH_MISMATCH
)
break;

dwSize += 0x1000;

pbyInfo=(PBYTE) realloc(pbyInfo,dwSize);
}

pProcessInfo = ( PPROCESSINFO ) pbyInfo;

for(;;)
{
pname=pProcessInfo-&gt;pszProcessName;

if (!pname)
pname=(L "Idle ");

printf( "%-40ls %-12lu %12luK\n ",
pname,
pProcessInfo-&gt;dwProcessID,
pProcessInfo-&gt;dwTotalWorkingSet/1024ul
);

if ( pProcessInfo-&gt;dwRelativeOffset == 0 )
break;


pProcessInfo=(PPROCESSINFO)((PBYTE)pProcessInfo+pProcessInfo-&gt;dwRelativeOffset);
}

free( pbyInfo );
}
}

int main(void)
{
ShowPI();
getchar();
return 0;
}

热点排行