在进程间使用事件对象

时间:2010-11-09 05:06:24

标签: winapi events synchronization

我正在尝试在win32环境中使用事件对象来同步两个进程。以下是两个程序的简化代码。

// process1
int main()
{
    HANDLE h = CreateEvent(NULL, FALSE, FALSE, TEXT("Hello"));
    WaitForSingleObject(h, INFINITE);
//  RunProcess(L"process2.exe", L"");
}

// process2
int main()
{
    HANDLE h = OpenEvent(EVENT_MODIFY_STATE, FALSE, TEXT("Hello"));
    SetEvent(h);    
}

这很简单,当两个进程独立启动时效果很好。但是,当进程1将进程2作为子进程启动时(在上面的代码中已注释),它不起作用 - SetEvent调用失败。这个问题的原因和解决方案是什么?

3 个答案:

答案 0 :(得分:3)

您的代码需要检查并处理错误。如果CreateEventOpenEvent失败,NULLGetLastError都将返回WaitForSingleObject,在这种情况下,您需要使用SetEvent检查错误。

我们也应根据MSDN文档检查您对bInheritHandleeventAttributes的来电。

您需要在父进程中执行操作的顺序是:

  • CreateEvent
  • 启动子流程
  • WaitForSingleObject的。

否则你会遇到@Mark Tolonen所提出的问题。

最好在等待时超时,以处理子进程无法启动,意外退出或挂起的情况。

如果您打算使用此父/子关系,另一种方法是允许继承事件句柄。然后事件不需要被命名,没有其他人可以在你的应用程序的DoS攻击中“蹲”它。您可以将句柄值作为命令行参数传递给子级。您可以使用CreateEvent参数{{1}}上的{{1}}字段执行此操作。

  

一个布尔值,指定是否   返回的句柄是在继承时继承的   创建一个新流程。如果这   成员是TRUE,新进程   继承句柄。

答案 1 :(得分:2)

你确定吗?如上所述,如果process1在当前位置创建process2,它将永远不会创建process2,因为它将永远等待事件被触发。首先创建process2,然后等待事件设置。

答案 2 :(得分:2)

你有一个NULL安全描述符,文档说不允许子进程继承句柄,特别是:

If this parameter is NULL, the handle cannot be inherited by child processes

也许你需要创建一个合适的安全描述符?