gpt4 book ai didi

winapi - 在进程间使用事件对象

转载 作者:行者123 更新时间:2023-12-02 11:42:57 24 4
gpt4 key购买 nike

我正在尝试在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 调用失败。这个问题的原因和解决办法是什么?

最佳答案

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

还应根据 MSDN 文档检查对 WaitForSingleObjectSetEvent 的调用。

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

  • 创建事件
  • 启动子进程
  • WaitForSingleObject。

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

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

如果您打算使用此父/子关系,另一种方法是允许继承事件句柄。那么该事件就不需要命名,其他人也无法在对您的应用程序进行 DoS 攻击时“抢占”该事件。您可以将句柄值作为命令行参数传递给子级。您可以使用 CreateEventeventAttributes 参数上的 bInheritHandle 字段来执行此操作。

A Boolean value that specifies whether the returned handle is inherited when a new process is created. If this member is TRUE, the new process inherits the handle.

关于winapi - 在进程间使用事件对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4130687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com