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