在真实应用中,经常需要一个可执行文件,只能产生一个进程,如果多次执行可能导致bug。
最典型的应用是微信,它虽然不构成多个进程存在会报异常的问题。但是它是一个很好的例子。无论怎么操作都只能在一个环境下只有一个微信进程。
为达到相同的效果可以参考本文:
应用环境:win11,mingw64(Posix),vscode
效果:模拟一个进程长时间存在,然后在执行同一个执行文件,第二个进程直接退出,保证系统只存在一个执行实例。
这里主要介绍如何在windows下如何实现,在其他系统下原理类似
项目文件:
单进程\\
|----main.cpp
如所见:就一个main.cpp
main.cpp内容:代码结构解读从main->ACopyFileExt如果有互斥的量,则进程直接退出,如果没有则进程继续。
#include <iostream>
#include <Windows.h>
bool ACopyFileExt()
{
HANDLE mutex;
mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "ACopyFileExt");
if (mutex == NULL)
{
std::cout << "frist "<<std::endl;
mutex = CreateMutex(NULL, FALSE, "ACopyFileExt");
}
else
{
std::cout << "exti "<<std::endl;
exit(-1);
}
WaitForSingleObject(mutex, INFINITE);
return 1;
}
int main(int argc, char* argv[])
{
ACopyFileExt();
while(1)
{
std::cout << "still run "<<std::endl;
Sleep(5000);
}
return 0;
}
编译命令:
g++ main.cpp
此时的项目文件:
单进程\\
|----main.cpp
|---a.exe
在两个命令行中运行这个执行程序:会发现一个持续运行,另一个直接退出如图:
这种操作可以用在进程间合作,也可用在进程互斥。