Events Win32命名事件的间歇性问题

Events Win32命名事件的间歇性问题,events,winapi,synchronization,Events,Winapi,Synchronization,遇到间歇性问题,与进程在不同用户上下文中运行时的命名事件有关:此类事件句柄的WaitForSingleObject(以及WaitForMultipleObjects)失败,WAIT_失败(GetLastError返回6-无效句柄值) 我们有一个应用程序,可以在Windows计算机上以用户帐户调度任务,而问题发生在某些任务完成后 应用程序的服务部分(JobManager)启动用户帐户(CreateProcessAsUser)下的可执行文件(JobLeader)以运行用户任务,并等待通知命名事件。

遇到间歇性问题,与进程在不同用户上下文中运行时的命名事件有关:此类事件句柄的WaitForSingleObject(以及WaitForMultipleObjects)失败,WAIT_失败(GetLastError返回6-无效句柄值)

我们有一个应用程序,可以在Windows计算机上以用户帐户调度任务,而问题发生在某些任务完成后

应用程序的服务部分(JobManager)启动用户帐户(CreateProcessAsUser)下的可执行文件(JobLeader)以运行用户任务,并等待通知命名事件。 手动重置命名事件由JobLeader在“Global\”命名空间中创建,并在用户任务完成时发出信号

JobManager在循环中等待,以10秒的延迟调用WFMO(WaitForMultipleObjects),以查看是否通知了命名事件或JobLeader进程句柄

JobManager通过OpenEvent API调用打开的周期性命名事件句柄会导致WFMO(WFSO也会在确定哪个句柄已损坏后调用)返回WAIT_FAILED,错误代码为6-“无效句柄值”。 重新打开事件后,此错误可能会消失,也可能不会-WFMO可能会再次返回WAIT_FAILED,因为句柄值无效

有趣的是,它可以在没有这个错误的情况下通过几十个任务,然后-依次地,很少有任务有这个错误。用于测试的任务是相同的-只是一个cmd.exe脚本,转储环境

有人对此有想法吗

问候,,
Alex

您是否在JobManager中创建事件,然后在“JobLeader”中打开它?如果没有,如何在两个进程之间传递事件句柄(和/或名称)


我的直觉告诉我这是比赛条件

Hi Len,正如我前面所说,“手动重置命名事件是由JobLeader在“全局\”命名空间中使用CreateEvent()创建的”。JobLeader正在控制用户任务,并在任务完成时通知JobManager,通过SetEvent()向此命名事件发送信号。JobManager特别使用“OpenEvent”打开此命名事件。更重要的是,这是在150秒的周期内完成的——如果前一次尝试失败,则每10秒尝试打开一次(在这种情况下,如果JobLeader尚未创建事件,但从未发生过)。是的。。。我的直觉告诉我同样的。。。特别是因为ii间歇性…此外,JobLeader和JobManager之间还有一个通过本地套接字的RPC通信通道。为了建立这种连接,我还使用命名事件,在JobLeader启动RPC服务器时设置,以便JobManager可以连接到它并传递任务信息(环境、命令行和参数、工作目录等)。事件名称是使用唯一的任务ID(数字)和JobLeader进程ID形成的。顺便说一句-命名事件从未出现过问题,用于表示RPC服务器就绪…为什么不在JobManager中创建事件,然后在派生的进程中打开它?那就不可能有比赛条件了。由于您的失败处于Wait()阶段,您是否在打开后检查错误?您是说打开事件OK,然后在等待()时失败吗?可能是安全权限导致打开失败?JobManager作为系统帐户运行,具有更高的权限,因此从理论上讲,它应该能够打开使用默认优先级创建的任何同步对象。特别是,因为它只打开以读取(获取状态)。当然,正如我在第一条评论中所写,它在150秒内检查OpenEvent是否有错误。(15次尝试打开)-但通常在第一次尝试时打开。非常感谢关于在JobManager中创建事件的想法。。。将尝试:)只是您的问题说WaitForMultipleObjects()因无效句柄而失败。。。如果Open()有效,而您在等待之前或等待期间未关闭对象,那么如何获得无效句柄??您(以及衍生的进程)是否可以在等待期间关闭对象??