使用共享内存的保镖程序
最近需要对程序加一个保护机制,为了能够持续运行而编写一个保镖程序,保镖程序的功能就是启动被保护的程序。
平台:Win10
对于共享内存,大家都知道常用于进程通信,本篇文章其实也是简易的进程通信。这个保护机制的需求下来以后,我的第一个思路就想到了共享内存,毕竟之前为了让主程序启动唯一性,就用了共享内存来判断,这时候正是扩展其应用的时候。
先来看一段我主程序main函数的开头一段:
QSharedMemory mem("MainProgram");//最好以改程序名称为命名,定义共享内存mem
if(!mem.create(1))//创建共享内存mem,如果该共享内存已存在,则退出
{
return 0;
}
然后看一段我保镖程序main函数的一段:
QSharedMemory mem("Protector");//以系统exe名称为参数,定义共享内存mem
if(!mem.create(1))//创建共享内存mem,如果该共享内存已存在,则退出
{
return 0;
}
这样两块共享内存创建完毕,分别命名为MainProgram和Protector。这段也可以防止程序重复运行。
这时候两个程序都开一个线程检测该共享内存块是否存在即可。若不存在则开启对方。
void BlackProtecter::run()
{
if(NULL == checkMemory)
{
checkMemory = new QSharedMemory("Protector"); // 保镖程序这块为 MainProgram
}
while(true)
{
if(checkMemory->attach(QSharedMemory::ReadOnly)) // 尝试绑定这块共享内存 若不存在则绑定失败
{
checkMemory->detach(); // 解除绑定 给下次绑定使用
}
else
{
QProcess _temp;
_temp.start(".\\startp.bat"); // 运行保镖程序的脚本
_temp.waitForFinished();
}
sleep(3);
}
}
代码只贴了一部分,但是足矣。启动脚本有两个,分别是运行保镖程序和主程序。