2

スニペットは次のとおりです:prog1:

HANDLE hM;
hM = CreateMutexA(NULL,TRUE, "abc"); // I have to use TRUE otherwise WaitForSingleObject fails.. by design it wants to take ownership and w//o TRUE there is no owner anyway right? <<-- **check this please if its true**
...

prog2:

HANDLE hM;
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
while(WaitForSingleObject(hM,INFINITE)) {
// do smthing
ReleaseMutex(hM);
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc"); // In order to continue while loop but it doesnt rewind,
}

問題>半無限ループにはなりません...一度入るとそれだけです。

目的?一部のプロセスのアクティビティを監視するには(クラッシュした場合は再起動します)、無限ループがCPUに大きな打撃を与え、Sleepを使用できないため、asaspで再起動する必要があります(while(1)またはfor( ;;)投稿してください)

アップデート

while(WaitForSingleObject(hM、INFINITE)== WAIT_ABANDONED){...}である必要がありますが、正しくコピーしませんでした:)。

一度動作すると再び待機しなくなりますが、ハンドルをリセットする方法はありますか?


prog1:

HANDLE hM;
hM = CreateMutexA(NULL,TRUE, "abc");

prog2:

HANDLE hM;
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
while(WaitForSingleObject(hM,INFINITE)) {    
ReleaseMutex(hM);
Sleep(1000);
CloseHandle(hM)
// do smthing like CreateProcess()
Sleep(1000);
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
}

誰かがこの投稿に何かコメントを追加したい場合は、このように機能します。

4

3 に答える 3

4

プロセスのクラッシュを検出するために、ミューテックスを気にする必要はありません。プロセスハンドルを待つだけです。プロセスが終了すると、ハンドルに信号が送られ、WaitForSingleObject戻ります。

PROCESS_INFORMATIONプロセスを作成している場合は、引数からプロセスハンドルを取得できます。次に、次を使用します。

PROCESS_INFORMATION pi;

do {
// create the process, passing pi as the last argument to CreateProcess
} while (WaitForSingleObject(pi.hProcess, INFINITE));

ハンドルを閉じる必要があることに注意してください。いつかがわかります。


更新-これがオプションではない場合、コードの問題は次のとおりです。

prog1が正常に開始され、prog2がミューテックスが通知されるのを待機しているとします。次に、prog1がクラッシュし、prog2がミューテックスを所有するようになります。prog2の目的がprog1を再起動することであるとすると、これがで発生することだと思い// do smthingます。これでprog1が起動し、を呼び出しますCreateMutexA。ただし、prog2はまだミューテックスを保持している可能性があるため、prog1は既存のミューテックスへのハンドルのみを取得しますが、実際にはそれを所有していません。ここで、prog2はReleaseMutexを呼び出し、prog1が所有していないシグナルミューテックスを待機し続けます。待機はすぐにに戻りWAIT_OBJECT_0、。から抜け出しますwhile

CreateMutexAしたがって、prog1の使用はここでは間違っていると思います。代わりに、所有されていないミューテックスを作成し、それを待つ必要があります。このようにして、prog1のミューテックスの所有権を確認します。

于 2011-10-14T08:09:07.440 に答える
1

プロセスハンドルを直接待つ必要があるというエランの主張に同意します。

while簡単に解決できるはずだと思ったときに、コードがループに入らない理由について。whileループは、0を返すと終了します。WaitForSingleObjectつまり、を返すときWAIT_OBJECT_0、つまりミューテックスの所有権を取得したときに終了します。それは前の所有者がそれを解放したときに起こります。

于 2011-10-14T08:12:46.720 に答える
0

ミューテックスを再度開く必要はありません。WaitForSingleObjectが所有権を取得し、ReleaseMutexが所有権を解放しますが、CloseHandleを呼び出すまでミューテックスは開いたままになります。

于 2011-10-14T08:47:32.810 に答える