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

时间:2017-03-19 02:44:51

标签: c++

这些问题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

是否有跨平台的方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

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

这可以通过使用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);
}

答案 1 :(得分:-1)

这并不是一个完整的答案,而是考虑持有特定文件句柄以进行独占访问。您可以像使用互斥锁一样使用它,但还有一个额外的好处,即操作系统应该自动“清理”进程终止时的句柄。

我不能说这是否适用于Linux,但至少在Windows上,这应该会让你达到同样的效果。希望有所帮助。