⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4-1.cpp

📁 所有的操作系统实验相当好的
💻 CPP
字号:
// event项目
# include <windows.h>
# include <iostream>

// 以下是句柄事件。实际中很可能使用共享的包含文件来进行通讯
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<void*>(&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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -