进程互斥c++|操作系统

发布于 2021-07-10  24 次阅读


这是进程互斥的c++代码,如果对其中函数有不理解的可以看我另一篇博客进程相关函数汇总解释,对照着看,可能方便你理解

#include "iostream" 
#include <Windows.h> 
#include <tchar.h>

using namespace std;
static LPCTSTR g_szMutexName = _T("w2kdg.ProcTerm.mutex.Suicide");
//创建当前进程的克隆进程的简单方法 
void StartClone()
{    //提取当前可执行文件的文件名
    TCHAR szFilename[MAX_PATH];
    GetModuleFileName(NULL, szFilename, MAX_PATH);
    //格式化用于子进程的命令行,指明它是一个 EXE 文件和子进程 
    TCHAR szCmdLine[MAX_PATH];
    sprintf_s(szCmdLine,_T("\"%s\" child"), szFilename);
    //子进程的启动信息结构 
    STARTUPINFO si;
    ::ZeroMemory((void*)(&si), sizeof(si));
    si.cb = sizeof(si); //应当是此结构的大小
    //返回的用于子进程的进程信息 
    PROCESS_INFORMATION pi; //用同样的可执行文件名和命令行创建进程,并指明它是一个子进程 
    BOOL bCreateOK = CreateProcess(
        szFilename,             //产生的应用程序名称(本 EXE 文件)
        szCmdLine,              //告诉人们这是一个子进程的标志
        NULL,                   //用于进程的默认的安全性
        NULL,                   //用于线程的默认安全性 
        FALSE,                  //不继承句柄
        NULL,                   //创建新窗口,使输出更直观
        NULL,                   //新环境 
        NULL,                   //当前目录
        &si,                    //启动信息结构
        &pi);                   //返回的进程的信息
        //释放指向子进程的引用 
    if (bCreateOK)
    {
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
}

void Parent()
{
    //创建“自杀"互斥程序体
    HANDLE hMutexSuicide = ::CreateMutex(//CreateMutex作用是找出当前系统是否已经存在指定进程的实例
        NULL,       //默认的安全性 
        TRUE,       //最初拥有的
        g_szMutexName); //为其命名
    if (hMutexSuicide != NULL)
    {
        //创建子进程
        cout << "Creating the child process." << endl;
        StartClone();
        //暂停
        Sleep(5000);
        //指令子进程“杀"掉自身 
        cout<<"Telling the child process to quit."<<endl; 
        ReleaseMutex(hMutexSuicide); //消除句柄
        CloseHandle(hMutexSuicide);
    }
}

void Child()
{
    //打开“自杀"互斥体
    HANDLE hMutexSuicide = OpenMutex(//OpenMutex函数为现有的一个已命名互斥体对象创建一个新句柄
        SYNCHRONIZE,
        //打开用于同步
        FALSE,
        //不需要向下传递 
        g_szMutexName); //名称
    if (hMutexSuicide != NULL) //如果发现父亲线程创建的互斥量存在,则消除该句柄
    {
        //报告正在等待指令
        cout << "Child waiting for suicide instructions." << endl;
        WaitForSingleObject(hMutexSuicide, INFINITE);
        //报告准备好终止,消除句柄
        cout << "Child quiting." << endl;
        CloseHandle(hMutexSuicide); 
        Sleep(1000);
    }
}

int _tmain(int argc, _TCHAR* argv[]) {
    //决定其行为是父进程还是子进程
    if (argc > 1 &&strcmp(argv[1],"child") == 0)
    {
        Child();
    }
    else
    {
        Parent();
    }
    return 0;
}