最近在做一個項目,添加了一個功能:防止一個程式能夠重複啟動。
包括Windows平台和Linux平台,其中Q_OS_WIN32宏用來表示編譯運作的目标平台是windows,Q_OS_LINUX則标示目标為linux。
實作的思想是:對windows和linux分别采取了全局互斥變量和檔案鎖的方法。
實作方法:
#if defined Q_OS_WIN32 //for win
#include <windows.h>
bool checkOnly()
{
// 建立互斥量
HANDLE m_hMutex = CreateMutex(NULL, FALSE, L"fortest_abc123" );
// 檢查錯誤代碼
if (GetLastError() == ERROR_ALREADY_EXISTS) {
// 如果已有互斥量存在則釋放句柄并複位互斥量
CloseHandle(m_hMutex);
m_hMutex = NULL;
// 程式退出
return false;
}
else
return true;
}
#endif
#if defined Q_OS_LINUX //for linux
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
bool checkOnly()
{
const char filename[] = "/tmp/lockfile";
int fd = open (filename, O_WRONLY | O_CREAT , 0644);
int flock = lockf(fd, F_TLOCK, 0 );
if (fd == -1) {
perror("open lockfile/n");
return false;
}
//給檔案加鎖
if (flock == -1) {
perror("lock file error/n");
return false;
}
//程式退出後,檔案自動解鎖
return true;
}
#endif
測試:
int main(int argc, char *argv[])
{
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));
Q_INIT_RESOURCE(wisdpsclient);
QApplication app(argc, argv);
//檢查程式是否 已經啟動過
if(checkOnly()==false)
return 0;
Test dialog;
dialog.show();
return app.exec();
}