我使用Qt和努力實現由應用this解決方案的Linux(Ubuntu的)一個單實例應用程序。問題是,如果應用程序意外完成(seg。fault或用戶終止它),共享內存將保持連接狀態,並且其他進程不能再次創建它。從QSharedMemory回收文檔:C++共享內存泄漏,如何清除共享內存?
Unix:QSharedMemory「擁有」共享內存段。當最後一個 線程或進程的QSharedMemory實例連接到一個 特定共享內存段從該段分離 銷燬它的QSharedMemory實例時,Unix內核釋放 共享內存段。但是,如果最後一個線程或進程崩潰 而不運行QSharedMemory析構函數,共享內存 段生存的崩潰。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Ensure single instanse of Cevirgec application
QSharedMemory shared(ApplicationConstants::
if(!shared.create(512, QSharedMemory::ReadWrite))
{
// QMessageBox msgBox;
QMessageBox::critical(0, QObject::tr("application is already running!"), QObject::tr("application is already running!"), QMessageBox::Ok, QMessageBox::Ok);
qCritical() << "application is already running!";
exit(0);
}
else {
qDebug() << "application staring...";
}
return a.exec();
}
你可以建議在這裏有什麼解決辦法?我怎樣才能確保在進程最終完成後清除共享內存(或通常使用的任何動詞)。我需要在Java類似finally
各地主要功能:在(解決方案)
我以QSharedMemory和捕獲SIGSEGV信號,然後調用sharedMemory.detach達到了預期的行爲():/
編輯信號處理程序。
您可能不應該試圖創建一個與操作系統和用戶期望應用程序行爲不同的應用程序。如果操作系統的標準行爲使得用戶希望能夠啓動多個實例,如在Windows和Linux上,那麼他們應該能夠。如果標準行爲是強制一個實例,就像在Mac上一樣,然後讓操作系統自己執行。 – bames53
那麼在操作系統中沒有這種行爲的標準。它完全取決於應用程序 – destan
bames53:有大量應用程序只允許您啓動一個實例,有時這是合乎邏輯的事情。 – rubenvb