跨平台方式,以防止打开应用程序的多个实例
Cross platform way to prevent opening multiple instances of an application
这些问题如何阻止运行同一程序的两个实例?,如何在C或C++中创建单个实例应用程序和防止我的应用程序的多个实例解决如何防止为一个平台打开同一应用程序的多个实例(Windows
,Linux
(。
有没有跨平台的方法来实现这一点?
回答我的问题,因为我在其他问题中没有找到其他人解决这个问题。
这可以使用boost/interprocess/sync/named_mutex
以跨平台的方式实现(我使用boost 1.63
(
我在Linux
和Windows
上都进行了测试,并且该实现阻止打开应用程序的第二个实例。
我发现的问题是,如果我终止进程(在两个平台上(,则不会删除互斥锁,因为未调用析构函数~MyApplication
。因此,只有在系统重新启动后,我才能再次运行该应用程序。
#include <boost/interprocess/sync/named_mutex.hpp>
#include <iostream>
class MyApplication
{
public:
MyApplication() = default;
~MyApplication()
{
if (mLockedByThisInstance)
{
boost::interprocess::named_mutex::remove("myApplicationMutex");
}
}
bool IsAlreadyRunning()
{
mLockedByThisInstance = mNamedMutex.try_lock();
if (!mLockedByThisInstance)
{
return true;
}
return false;
}
int Run(int argc, char *argv[])
{
// Application main loop
return 0;
}
private:
bool mLockedByThisInstance = false;
boost::interprocess::named_mutex mNamedMutex{ boost::interprocess::open_or_create,
"myApplicationMutex" };
};
int main(int argc, char *argv[])
{
MyApplication myApplication;
if (myApplication.IsAlreadyRunning())
{
std::cout << "MyApplication is already running!n";
return 1;
}
return myApplication.Run(argc, argv);
}
这不是一个完整的答案,但可以研究一下诸如持有特定文件句柄以进行独占访问之类的事情。您可以像互斥锁一样使用它,但还有一个额外的好处,即操作系统应该在进程终止时自动"清理"句柄。
我不能说这是否适用于Linux,但至少在Windows上,这应该可以让您达到相同的效果。希望有帮助。
相关文章:
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 在Visual Studio中单实例Qt应用程序版本5.11.1中,在所有其他窗口的顶部打开Qt MainWindow
- 当我们实例化Caffe2预测器时,应用程序被卡住了
- 跨平台方式,以防止打开应用程序的多个实例
- ACE在同一PC上具有多个应用程序实例 - 仅首先获取消息
- 我该如何验证给定类的每个实例都被应用程序终止所破坏
- c++单例类实例访问整个应用程序
- 使用boost组件实例化C++库类的Mono C#应用程序
- 如何在崩溃时管理Qt应用程序的单个实例
- 在 QT 中启动外部控制台应用程序的多个实例并捕获输出
- 如何在本地 Windows 网络上发现我的应用程序的所有其他实例
- 应用程序在 的协同创建实例期间挂起.基于 NET 的 COM 对象
- 如何在具有 DLL 的应用程序中实现单一实例
- 我将如何允许运行 TTS 应用程序的多个实例
- Qt中的单实例应用程序
- 向同一网络上的应用程序的所有其他实例发送消息
- Qt5:阻止应用程序的另一个实例不再有效...!
- 在Windows(C++)中运行的应用程序实例中打开文件
- 一个应用程序实例,独立于平台,C++11
- 如何调用已运行的应用程序实例