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

这是进程互斥的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;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值