我正在尝试在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调用失败。这个问题的原因和解决方案是什么?
答案 0 :(得分:3)
您的代码需要检查并处理错误。如果CreateEvent
和OpenEvent
失败,NULL
和GetLastError
都将返回WaitForSingleObject
,在这种情况下,您需要使用SetEvent
检查错误。
我们也应根据MSDN文档检查您对bInheritHandle
和eventAttributes
的来电。
您需要在父进程中执行操作的顺序是:
否则你会遇到@Mark Tolonen所提出的问题。
最好在等待时超时,以处理子进程无法启动,意外退出或挂起的情况。
如果您打算使用此父/子关系,另一种方法是允许继承事件句柄。然后事件不需要被命名,没有其他人可以在你的应用程序的DoS攻击中“蹲”它。您可以将句柄值作为命令行参数传递给子级。您可以使用CreateEvent
参数{{1}}上的{{1}}字段执行此操作。
一个布尔值,指定是否 返回的句柄是在继承时继承的 创建一个新流程。如果这 成员是TRUE,新进程 继承句柄。
答案 1 :(得分:2)
答案 2 :(得分:2)
你有一个NULL安全描述符,文档说不允许子进程继承句柄,特别是:
If this parameter is NULL, the handle cannot be inherited by child processes
也许你需要创建一个合适的安全描述符?