www.pudn.com > OS.rar > 2-3.cpp
// procterm项目 # include# include # include static LPCTSTR g_szMutexName = "w2kdg.ProcTerm.mutex.Suicide" ; // 创建当前进程的克隆进程的简单方法 void StartClone() { // 提取当前可执行文件的文件名 TCHAR szFilename[MAX_PATH] ; :: GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行,指明它是一个EXE文件和子进程 TCHAR szCmdLine[MAX_PATH] ; :: sprintf(szCmdLine, "\"%s\"child" , szFilename) ; // 子进程的启动信息结构 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) ; } } void Parent() { // 创建“自杀”互斥程序体 HANDLE hMutexSuicide=:: CreateMutex( NULL, // 缺省的安全性 TRUE, // 最初拥有的 g_szMutexName) ; // 为其命名 if (hMutexSuicide != NULL) { // 创建子进程 std :: cout << "Creating the child process." << std :: endl; :: StartClone() ; // 暂停 :: Sleep(5000) ; // 指令子进程“杀”掉自身 std :: cout << "Telling the child process to quit. "<< std :: endl; :: ReleaseMutex(hMutexSuicide) ; // 消除句柄 :: CloseHandle(hMutexSuicide) ; } } void Child() { // 打开“自杀”互斥体 HANDLE hMutexSuicide = :: OpenMutex( SYNCHRONIZE, // 打开用于同步 FALSE, // 不需要向下传递 g_szMutexName) ; // 名称 if (hMutexSuicide != NULL) { // 报告我们正在等待指令 std :: cout <<"Child waiting for suicide instructions. " << std :: endl; :: WaitForSingleObject(hMutexSuicide, INFINITE) ; // 准备好终止,清除句柄 std :: cout << "Child quiting." << std :: endl; :: CloseHandle(hMutexSuicide) ; } } int main(int argc, char* argv[] ) { // 决定其行为是父进程还是子进程 if (argc>1 && :: strcmp(argv[1] , "child" )== 0) { Child() ; } else { Parent() ; } return 0; }