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**
...

编2:

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,我不能使用睡眠,我需要重新启动它 asasp(如果可以通过 while(1) 或 for( ;;) 请张贴)

更新

应该是 while(WaitForSingleObject(hM,INFINITE) == WAIT_ABANDONED){ ... },我没有正确复制:)。

它工作一次,然后它不会再等待,有没有办法重置句柄?


编1:

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

编2:

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

所以,我认为 prog1CreateMutexA在这里的使用是错误的。相反,您应该创建一个未拥有的互斥锁,然后等待它。这样,您将确保 prog1 对互斥体的所有权。

于 2011-10-14T08:09:07.440 回答
1

我同意eran 的观点,即您应该直接等待进程句柄。

while至于为什么您的代码在您认为应该很容易解决时没有进入循环。while循环在返回 0 时终止。也就是说WaitForSingleObject,当它返回 时WAIT_OBJECT_0,或者换句话说,当它获得互斥锁的所有权时。当前任所有者释放它时,就会发生这种情况。

于 2011-10-14T08:12:46.720 回答
0

您无需重新打开互斥锁。WaitForSingleObject 取得所有权,ReleaseMutex 释放所有权,但互斥体保持打开状态,直到您调用 CloseHandle。

于 2011-10-14T08:47:32.810 回答