我正在制作一个Qt 5应用程序,它可以读取特定类型的文件,我想将其限制在一个实例中。我想将命令行参数从第二个实例转移到第一个实例,以便在用户双击该文件时打开该文件。
我发现的大多数信息都是关于简单地禁用运行第二个实例和不传递数据。我找到了QLocalServer
,但很明显,当应用程序在GNU/Linux上崩溃时,它并没有被破坏。我也找到了boost::interprocess::message_queue
,但看起来我必须有一个专用线程来读取它。以下是我发现的最接近的东西:https://github.com/itay-grudev/SingleApplication/它提供了一个我可以听到的信号,但不幸的是,它没有提供通过命令行的选项。
什么是最好的解决方案?我关心的操作系统是GNU/Linux、Mac、Windows,最好是Android。
另一种方法是使用预定义的套接字名称或本地TCP套接字(在不支持unix套接字的平台上)创建和绑定unix域套接字。绑定仅对应用程序的第一个实例成功。当应用程序因任何原因终止时,操作系统会解除套接字的绑定。当bind()
失败时,意味着应用程序的另一个实例已经在运行。第二个实例可以connect()
,并使用此套接字将其命令行参数传递给第一个实例。
好吧,我遵循了@peppe的建议,并在这个例子中使用了代码,它成功了。