2017-03-02 61 views
1

Qt C++を使用してアプリケーションを実装しています。ここでは、QSharedMemoryを使用してアプリケーションの複数のインスタンスを制限しています。次のようにmain.cpp内の関連するコードセグメントは、アプリケーションを開くにはアプリケーションのクラッシュ時にQSharedMemoryが削除されない

QSharedMemory sharedMemory; 
sharedMemory.setKey(SM_INSTANCE_KEY); 

if (!sharedMemory.create(1)) 
{ 
    QMessageBox::warning(0, "Console", "An instance of this application is already running!"); 
    exit(0); /* Exit, already a process is running */ 
} 

ですが、私は、共有メモリが自分のアプリケーション用に作成されていることがわかります。 (shmid 7045192、size 1B)

enter image description here

これまでのところは良いです。アプリケーションが何らかの理由でクラッシュすると問題が発生します。クラッシュすると、sharedMemoryがクリアされないので、もうアプリケーションを開くことができません。クラッシュすると、アタッチされたアプリケーションの数は0になりますが、共有メモリは削除されません。私の理解などを1として

enter image description here

を次のように関連するスクリーンショットは、共有メモリの状態が他の共有思い出のようなdestとしてマークされていないとして、いずれかが存在しない場合でも削除取得されていません添付されたプロセス。

私の質問は、共有メモリのステータスをdestとマークする方法はありますか?

答えて

4

QSharedMemory文書の引用:このクラスを使用する場合

は、以下のプラットフォームの違いに注意してください。

のWindows:QSharedMemoryは、共有メモリ・セグメントを "所有" しません。特定の共有メモリセグメントにQSharedMemory のインスタンスを持つすべてのスレッドまたはプロセスが、QSharedMemoryのインスタンスを破棄した場合、Windowsカーネルは 共有メモリセグメントを自動的に解放します。

Unix:QSharedMemoryが共有メモリセグメントを「所有」しています。 QSharedMemoryのインスタンスを持つ最後のスレッドまたはプロセスが、 を特定の共有メモリセグメントに接続すると、 がQSharedMemoryのインスタンスを破棄してセグメントから切り離されたとき、Unixカーネルは 共有メモリセグメントを解放します。しかし、最後のスレッドまたはプロセスがQSharedMemoryデストラクタを実行せずに でクラッシュした場合、共有メモリ セグメントはクラッシュしても存続します。

HP-UX:プロセスごとに1つの共有メモリセグメントへのアタッチのみが許可されます。つまり、QSharedMemoryは、HP-UXの同じプロセスで複数のスレッド で使用しないでください。

私は数年前にLinux上で同じ問題を追加しましたが、私たちは、これらの手順を実行して、問題を解決:

// Pseudo code 
if (create_share_memory() == failed) 
{ 
    // The failure may be caused by the shm already existing 
    attach() 
    detach() // This should delete the shm if no process use it 
    if (create_share_memory() == failed) 
    { 
     // We really cannot create the share memory, report the error 
     return failed 
    } 
} 
return ok 
+0

をこれは本当に良い解決策です。それは完璧に働いた。ありがとう。 –

+0

良い解決策、ありがとうございます。 –

+0

以下も可能です: 1- Init shm 2-アタッチ/デタッチ 3作成することができる場合はここをクリック このようにすれば、より読みやすくなり、x2の 'if'がなくなります。しかし、ありがとう、この修正は私の一日を節約! – user2629409

関連する問題