私はQtを使用しており、thisソリューションをLinux(ubuntu)に適用して、単一のインスタンスアプリケーションを実現しようとしています。問題は、アプリケーションが予期せず終了した場合(seg。faultまたはuserがkillする)、共有メモリは接続されたままであり、他のプロセスが再びそれを作成できないということです。 QSharedMemoryからリコールdoc: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
ようなものが必要:/
EDIT:(ソリューション)
私はQSharedMemoryを使用し、SIGSEGVシグナルをキャッチすることにより、目的の動作を達成した後、(sharedMemory.detachを呼び出す)でシグナルハンドラ
OSとユーザーがAppsの動作を期待する方法とは異なる動作をするアプリを作ろうとしないでください。 OSの標準的な動作が、WindowsやLinuxのように複数のインスタンスを起動できると想定されるようなものであれば、できるはずです。標準の動作がMacの場合と同じように単一のインスタンスを強制することである場合は、OSにそれを強制させます。 – bames53
OSにこのような振る舞いの標準はありません。それは完全にアプリケーションに依存しています – destan
bames53:1つのインスタンスを起動させるだけのアプリがたくさんあります。 – rubenvb