什么会导致进程停止重新创建

What can cause a process to stop being re-created?

本文关键字:新创建 创建 进程 什么      更新时间:2023-10-16

我们有一个用C++编写的服务,其中一些代码是通过CLI在.NET中编写的。由于第三方库在数据驱动的基础上覆盖内存,我们被迫将主处理代码剥离到一个单独的代码路径中,如下所示。当使用特定的命令行参数运行服务EXE时,我们可以将整个服务作为控制台应用程序运行,绕过服务部分,也可以作为只进行处理的控制台应用程序。在主操作模式下,服务正常启动,并使用createprocess通过命令行参数启动自己的可执行文件,跳过服务初始化,直接进入处理部分。然后,服务线程等待子进程完成,并根据需要重复此进程。

我们遇到的问题是,在1700个子进程运行后,服务无法启动自己的命令行版本。如果我们运气不好,服务也会拒绝重新启动。当服务拒绝重新启动时,内存中没有相关的进程。当服务失败后以命令行模式运行服务时,它会继续子进程的1700次运行,直到它也失败为止。需要重新启动系统才能恢复服务/命令行进程的工作。我们还在事件日志中得到错误322-"目标设备没有足够的资源来完成操作。"。我们已经删除了一个Job内核对象,该对象将子进程和父进程分组为一个单元,这样当您终止父进程时,子进程也会终止。这使1700人的上限增加了数千人。

windows为什么会记住某个进程已经运行,并在重新运行时惩罚该进程?在这个问题上,在不同的桌面或用户下运行的进程似乎被视为单独的进程。当服务失败时,命令行版本可以运行,并将运行一段时间。这与桌面堆有关吗?我们的记忆中永远不会同时有两个以上的过程。下一次在某个桌面/用户下运行时,什么类型的窗口功能可以对进程产生持久的影响?

听起来像是在泄漏父进程和子进程之间共享的内核资源。也许在每次启动子进程时,父进程都会创建某个资源的句柄,并将其传递(共享)给子进程,期望子进程关闭它。。。但没有按需要自行关闭?

SysInternal实用程序可以帮助您对此进行诊断。HandleEx或Process Explorer启动,然后使用Process Monitor进行挖掘。