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

📄 2-3.cpp

📁 操作系统试验代码
💻 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 + -