www.pudn.com > OS.rar > 3-1.cpp
// event项目 # include# include // 以下是句柄事件。实际中很可能使用共享的包含文件来进行通讯 static LPCTSTR g_szContinueEvent = "w2kdg.EventDemo.event.Continue"; // 本方法只是创建了一个进程的副本,以子进程模式 (由命令行指定) 工作 BOOL CreateChild() { // 提取当前可执行文件的文件名 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, // 生成的可执行文件名 szCmdLine, // 指示其行为与子进程一样的标志 NULL, // 子进程句柄的安全性 NULL, // 子线程句柄的安全性 FALSE, // 不继承句柄 0, // 特殊的创建标志 NULL, // 新环境 NULL, // 当前目录 &si, // 启动信息结构 &pi ) ; // 返回的进程信息结构 // 释放对子进程的引用 if (bCreateOK) { :: CloseHandle(pi.hProcess); :: CloseHandle(pi.hThread); } return(bCreateOK) ; } // 下面的方法创建一个事件和一个子进程,然后等待子进程在返回前向事件发出信号 void WaitForChild() { // create a new event object for the child process // to use when releasing this process HANDLE hEventContinue = :: CreateEvent( NULL, // 缺省的安全性,子进程将具有访问权限 TRUE, // 手工重置事件 FALSE, // 初始时是非接受信号状态 g_szContinueEvent); // 事件名称 if (hEventContinue != NULL) { std :: cout << "event created " << std :: endl; // 创建子进程 if (:: CreateChild()) { std :: cout << " chlid created" << std :: endl; // 等待,直到子进程发出信号 std :: cout << "Parent waiting on child." << std :: endl; :: WaitForSingleObject(hEventContinue, INFINITE); :: Sleep(1500); // 删除这句试试 std :: cout << "parent received the envent signaling from child" << std :: endl; } // 清除句柄 :: CloseHandle(hEventContinue); hEventContinue=INVALID_HANDLE_VALUE; } } // 以下方法在子进程模式下被调用,其功能只是向父进程发出终止信号 void SignalParent() { // 尝试打开句柄 std :: cout << "child process begining......" << std :: endl; HANDLE hEventContinue = :: OpenEvent( EVENT_MODIFY_STATE, // 所要求的最小访问权限 FALSE, // 不是可继承的句柄 g_szContinueEvent); // 事件名称 if(hEventContinue != NULL) { :: SetEvent(hEventContinue); std :: cout << "event signaled" << std :: endl; } // 清除句柄 :: CloseHandle(hEventContinue) ; hEventContinue = INVALID_HANDLE_VALUE; } int main(int argc, char* argv[] ) { // 检查父进程或是子进程是否启动 if (argc>1 && :: strcmp(argv[1] , "child" )== 0) { // 向父进程创建的事件发出信号 :: SignalParent() ; } else { // 创建一个事件并等待子进程发出信号 :: WaitForChild(); :: Sleep(1500); std :: cout << "Parent released." << std :: endl ; } return 0; }