防止打开应用程序的多个实例的跨平台方式

Posted

技术标签:

【中文标题】防止打开应用程序的多个实例的跨平台方式【英文标题】:Cross platform way to prevent opening multiple instances of an application 【发布时间】:2017-03-19 02:44:51 【问题描述】:

How to block running two instances of the same program?、How to create a single instance application in C or C++ 和 Preventing multiple instances of my application 这些问题解决了如何防止专门为一个平台打开同一应用程序的多个实例(WindowsLinux)。

有没有跨平台的方式来实现这一点?

【问题讨论】:

【参考方案1】:

回答我的问题,因为我在其他问题中没有找到其他人解决这个问题。

这可以使用boost/interprocess/sync/named_mutex以跨平台方式实现(我使用boost 1.63

我在LinuxWindows 上都进行了测试,实现阻止了打开应用程序的第二个实例。

我发现的问题是,如果我终止进程(在两个平台上),则不会删除互斥锁,因为没有调用析构函数 ~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);

【讨论】:

"所以只有在系统重启后我才能再次运行应用程序。"我认为这应该值得一个带有 boost 的错误报告。【参考方案2】:

这并不是一个完整的答案,但请查看诸如持有特定文件句柄以进行独占访问之类的事情。您可以像使用互斥锁一样使用它,但额外的好处是操作系统应该在进程终止时自动“清理”句柄。

我无法确定这是否适用于 Linux,但至少在 Windows 上,这应该可以让您达到相同的效果。希望对您有所帮助。

【讨论】:

以上是关于防止打开应用程序的多个实例的跨平台方式的主要内容,如果未能解决你的问题,请参考以下文章

如何打开Visual Studio Code的多个实例

如何防止 iOS 14 Widget 打开应用程序并响应回调

打开另一个通知时,如何防止通知从通知中心消失? iOS

如何打开多个 Visual Studio Code 实例?

JS打开新窗口防止被浏览器阻止的方法

如何在 Mac 上启动多个 MonoDevelop 实例?