www.pudn.com > OS.rar > 2-1-1.cpp
// proccreate项目 #include#include #include // 创建传递过来的进程的克隆过程并赋于其ID值 void StartClone(int nCloneID) { // 提取用于当前可执行文件的文件名 TCHAR szFilename[MAX_PATH] ; :: GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行并通知其EXE文件名和克隆ID TCHAR szCmdLine[MAX_PATH]; :: sprintf(szCmdLine,"\"%s\" d%",szFilename,nCloneID); // 用于子进程的STARTUPINFO结构 STARTUPINFO si; :: ZeroMemory(reinterpret_cast (&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) ; } } int main(int argc, char* argv[] ) { // 确定进程在列表中的位置 int nClone(0) ; if (argc > 1) { // 从第二个参数中提取克隆ID :: sscanf(argv[1] , "%d" , &nClone) ; } // 显示进程位置 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; }