建立父进程,编写代码创建子进程,子进程的功能是克隆父进程,子进程每个0.5秒创建一次,创建25次,根据编写的源代码进行程序调试;
// proccreate项目
#include <windows.h>
#include <iostream>
#include <stdio.h>
//
void StartClone(int nCloneID)
{
// 提取当前可执行文件的文件名
TCHAR szFilename[MAX_PATH] ;
:: GetModuleFileName(NULL, szFilename, MAX_PATH) ;
// 格式化用于子进程的命令行,字符串“child”将作为形参传递给子进程的 main 函数
TCHAR szCmdLine[MAX_PATH];
:: sprintf(szCmdLine,"\"%s\" %d",szFilename,nCloneID);
//将下句中的字符串 child 改为别的字符串,重新编译执行,执行前请先保存已经完成的工作
// 子进程的启动信息结构
STARTUPINFO si;
:: ZeroMemory(reinterpret_cast <void*> (&si) , sizeof(si) ) ;
si.cb = sizeof(si) ; // 必须是本结构的大小
// 返回的用于子进程的进程信息
PROCESS_INFORMATION pi;
// 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质
BOOL bCreateOK=::CreateProcess(
szFilename, // 产生这个EXE的应用程序的名称
szCmdLine, // 告诉其行为像一个子进程的标志
NULL, // 缺省的进程安全性
NULL, // 缺省的线程安全性
FALSE, // 不继承句柄
CREATE_NEW_CONSOLE, // 使用新的控制台
NULL, // 新的环境
NULL, // 当前目录
&si, // 启动信息
&pi) ; // 返回的进程信息
// 释放指向子进程的引用
if (bCreateOK)
{
:: CloseHandle(pi.hProcess) ;//结束进程
:: CloseHandle(pi.hThread) ;//
}
//CloseHandle();之后,切断了子进程和父进程之间的关系,子进程可以独立的运行。
//TerminateProcess(hProcess) 强制性的终结一个进程。最好不用。
}
int main(int argc, char* argv[] )
{
//
int nClone(0);//定义nClone并初始化为0
if (argc > 1)
{
//
:: sscanf(argv[1] , "%d" , &nClone) ;
}
//arc 用来表示在命令行下输入命令的时候,一共有多少个参数。比方说程序编译后,可执行文件是test.exe
//D:\tc2>test
//此时argc的值是1
//D:\tc2>test.exe myarg1 myarg2
//此时argc的值是3。也就是 命令名 加上两个参数,一共三个参数
//char *argv[] 用来取得所输入的参数
//D:\tc2>test
//此时argc的值是1,argv[0]的值是 “test”
//D:\tc2>test myarg1 myarg2
//此时argc的值是3,argc[0]的值是”test”,argc[1]的值是”myarg1”,argc[2]的值是”myarg2”
// 显示进程位置
std :: cout << "Process ID:" << :: GetCurrentProcessId()
<< ", Clone ID:" << nClone
<< std :: endl;
// 定义子进程的最大个数
const int c_nCloneMax=25;
if (nClone < c_nCloneMax)
{
// 创建子进程
StartClone(++nClone) ;
}
// 在终止之前暂停一下 (l/2秒)
:: Sleep(500) ;
return 0;
}