【问题标题】: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)。

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

【问题讨论】:

    标签: c++


    【解决方案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 上,这应该可以让您达到相同的效果。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多