linux - 如何通过 QsystemSemphore 强制我的应用程序成为单一进程? Qt、Linux

标签 linux qt process

Possible Duplicate:
How to force my application to open one exe only? qt, linux

嗨,

我想强制我的应用程序只打开一个exe文件,如何通过QsystemSemaphore来做到这一点? 即如果过程

10 倍!

最佳答案

我认为使用 QSystemSemaphore 不容易解决这个问题。据我所知,此类仅支持阻止锁定尝试。这似乎是这里的要点:你只能调用release(总是成功,但不会告诉你任何东西)或acquire(它只会告诉你,你已经达到了限制,永远阻止你):

如果一个实例创建了一个信号量,它不会知道它是否真的创建了它,或者是否使用了现有的信号量。如果它是一个二进制信号量,则可能会发生两件事。它要么获得锁,这意味着它是第一个也是唯一的实例,要么它只是阻塞在那里,直到第一个实例退出。

为了绕过这个问题,你可以将该测试放入一个单独的线程中,这样你就可以在该线程上使用外部超时来检查它是否被阻止,但诚实地尝试这样的做法是肮脏的且极其危险的,没有办法让它以这种方式 100% 安全地工作。

当您谈论 exe 时,可能会认为这可以仅在 Windows 平台上解决?

//create a somewhat unique semaphore key, eg by hashing the application path
QString Key = QString("Local\\MyApp_%1").arg(qHash(QByteArray(argv[0])), 8, 16, QChar('0'));
HANDLE hMutex = CreateMutexW(NULL, FALSE, Key.utf16());
//NOTE: unlikely, but hMutex might be NULL, check for errors

//try to lock the mutex, but don't wait for it
if(WAIT_TIMEOUT == WaitForSingleObject(hMutex, 0))
{ //mutex is locked by another instance
 //TODO: handle that somehow
 return 0;
}

//TODO: place standard QT startup code here, for example
QApplication a(argc, argv);
QtMyApplication w;
w.show();
int iReturn = a.exec();

//release and close the mutex
ReleaseMutex(hMutex);
CloseHandle(hMutex);
return iReturn;

对于更便携的解决方案,可以使用锁定文件来完成非常类似的事情(打开一个临时文件以进行独占访问,我认为这就是 QtSingleApplication 所做的),但我个人不喜欢那种基于文件的解决方法。

关于linux - 如何通过 QsystemSemphore 强制我的应用程序成为单一进程? Qt、Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4095643/

相关文章:

c++ - 无法将 QMetaMethod 与 lambda 连接起来

c - 将标准输出/输入/错误重定向到/从文本框

linux - 哪个 linux 风格正在运行

c - func 之前预期为 '=' 、 ',' 、 ';' 、 'asm' 或 '__attribute__'

c++ - UI 未在 QT 设计器中更新

c++ - Qt 从 QTextStream 读取

node.js - 如何终止node.js上的子进程?

linux - 将 ELF 共享库和自定义 binfmt 可执行文件加载到同一 Linux 地址空间

php - 我如何让 rabbitmq 的客户脚本持续监听

linux - 通过C程序写入文件