WINDOWs平台利用CreateProcess实现进程复制
WINDOWs平台,利用CreateProcess实现进程复制
由于某种原因,要实现在主机端空CPU与内存利用的工具,CPU还比较容易控制,但内存控制比较不容易。
在WINDOWs/Linux平台上,用户进程虽然有4G逻辑地址空间,但实际上用户可控制的只有2G(Linux应为3G)的地址空间
因此在主机端内存大于2G以后,单进程无法控制内存利用率,需要将当前进程复制一份,或者多份(在Linux下fork() 可实现该功能,但Windows实现起来比较不容易)
首先定义读取内存信息,包括物理内存总量 与可用内存总量
runmemory.h 头文件定义
#ifndef _RUN_MEMORY_H
#define _RUN_MEMORY_H
struct MemoryInfo
{
unsigned long totalPhyMemory;
unsigned long availablePhyMemory;
};
class MemoryInfoManager
{
public:
MemoryInfoManager();
public:
~MemoryInfoManager();
public:
MemoryInfo *GetMemoryInfo();
};
#endif
runmemory.cpp 文件定义
#include "windows.h"
#include "runmemory.h"
MemoryInfoManager::MemoryInfoManager()
{
}
MemoryInfoManager::~MemoryInfoManager()
{
}
MemoryInfo* MemoryInfoManager::GetMemoryInfo()
{
MEMORYSTATUS memoryStatus;
memoryStatus.dwLength=sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&memoryStatus);
MemoryInfo *info=new MemoryInfo;
info->totalPhyMemory=memoryStatus.dwTotalPhys;
info->availablePhyMemory=memoryStatus.dwAvailPhys;
return info;
}
主文件定义
#include "windows.h"
#include
#include "runmemory.h"
using namespace std;
int main(int argc,char* argv[])
{
cout< STARTUPINFO si; //一些必备参数设置
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi; //必备参数设置结束
char *cmdLine=new char[sizeof(argv[0])+10];
cmdLine=strcat(argv[0]," 100");
if(argc<2)
{
if(!CreateProcess(NULL,cmdLine,NULL,NULL,FALSE,NULL
,NULL,NULL,&si,&pi))
//"d:\\test\\te.exe"是您要运行的程序//的路径
{
cout<<"Create Fail!"< exit(1);
}
else
{
cout<<"Success!"< }
}
MemoryInfoManager manager;
while(TRUE)
{
Sleep(2000);
MemoryInfo *info=manager.GetMemoryInfo();
cout<<"Total Physical Memory:"<totalPhyMemory<<" Available Physical Memory:"<availablePhyMemory< delete info;
cout<<"resume"< }
return 0;
} 原文地址:http://blog.csdn.net/zczh3/archive/2009/11/13/4809368.aspx