通常情况下,系统的进程是相互独立的,每个进程都拥有自己的独立资源和地址空间,进程间互不影响。故同意经常可以重复运行,且系统上进程互不影响。
一些特殊情况下,程序在系统上需要只保存一份进程实例,这就引出了进程互斥的问题。
微软提供了CreateMutex函数来创建或者打开一个已命名或未命名的互斥对象,程序在每次运行的时候,通过判断系统中是否存在相同命名的互斥对象来确定程序是否重复运行。
CreateMutexA函数一共有3个参数,第一个参数表示互斥对象的安全设置,是一个指向SECURITY_ATTRIBUTES结构的指针,在该程序中直接设置为NULL即可。第二个参数表示线程是否获得互斥锁对象的初始所有权,在该程序中,无论该参数为TRUE还是FALSE,均不影响程序的正常运行。第三个参数表示互斥对象的名称,对于通过互斥对象来判断进程实例是否重复运行的程序来说,该参数一定要设置,而且要保证设置名称的唯一性。
CreateMutexA函数:
HANDLE CreateMutexA(
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
编码实现:
/*
theme:单一运行实例
author:崇山主人
time:2022/10/19
*/
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
#include<SDKDDKVer.h>
BOOL IsAlreadyRun()
{
HANDLE hMutex = NULL;
hMutex = ::CreateMutexA(NULL, FALSE, "TEST");
if (hMutex)
{
if (ERROR_ALREADY_EXISTS == ::GetLastError())
{
return TRUE;
}
}
return FALSE;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (IsAlreadyRun())
{
printf("----------------------There is already a duplicate program running!!!----------------------\n");
}
else
{
printf("----------------------The current program runs for the first time!----------------------\n");
}
system("pause");
return 0;
}
测试结果:
程序首次运行时:
已经有该程序运行时;