?? 2-3.cpp
字號:
// procterm項目
# include <windows.h>
# include <iostream>
# include <stdio.h>
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 <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) ;
}
}
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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -