什么会导致进程停止重新创建
What can cause a process to stop being re-created?
我们有一个用C++编写的服务,其中一些代码是通过CLI在.NET中编写的。由于第三方库在数据驱动的基础上覆盖内存,我们被迫将主处理代码剥离到一个单独的代码路径中,如下所示。当使用特定的命令行参数运行服务EXE时,我们可以将整个服务作为控制台应用程序运行,绕过服务部分,也可以作为只进行处理的控制台应用程序。在主操作模式下,服务正常启动,并使用createprocess通过命令行参数启动自己的可执行文件,跳过服务初始化,直接进入处理部分。然后,服务线程等待子进程完成,并根据需要重复此进程。
我们遇到的问题是,在1700个子进程运行后,服务无法启动自己的命令行版本。如果我们运气不好,服务也会拒绝重新启动。当服务拒绝重新启动时,内存中没有相关的进程。当服务失败后以命令行模式运行服务时,它会继续子进程的1700次运行,直到它也失败为止。需要重新启动系统才能恢复服务/命令行进程的工作。我们还在事件日志中得到错误322-"目标设备没有足够的资源来完成操作。"。我们已经删除了一个Job内核对象,该对象将子进程和父进程分组为一个单元,这样当您终止父进程时,子进程也会终止。这使1700人的上限增加了数千人。
windows为什么会记住某个进程已经运行,并在重新运行时惩罚该进程?在这个问题上,在不同的桌面或用户下运行的进程似乎被视为单独的进程。当服务失败时,命令行版本可以运行,并将运行一段时间。这与桌面堆有关吗?我们的记忆中永远不会同时有两个以上的过程。下一次在某个桌面/用户下运行时,什么类型的窗口功能可以对进程产生持久的影响?
听起来像是在泄漏父进程和子进程之间共享的内核资源。也许在每次启动子进程时,父进程都会创建某个资源的句柄,并将其传递(共享)给子进程,期望子进程关闭它。。。但没有按需要自行关闭?
SysInternal实用程序可以帮助您对此进行诊断。HandleEx或Process Explorer启动,然后使用Process Monitor进行挖掘。
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何使用CLion在Mac上创建一个新的.txt文件
- C++:继续创建新的变量可以吗
- 如何使用新运算符跟踪在循环中创建的 QLabel
- C++ 如何在将新对象分配给另一个对象时创建新对象
- C++ 警告:将新创建的 gsl::owner<> 分配给非所有者
- 重用对象与创建新对象
- C++,创建新对象时类的对象更改
- 将一个 QWidget 链接到另一个新创建的 QWidget
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- cout 新创建的对象引发运行时错误
- 使用新运算符C++创建多维数组的简单方法
- C 矢量元素擦除与新向量创建
- 如何使用安置新操作员创建对象数组
- 我如何在参考上使用数据成员而不使用新关键字创建对象
- 通过使用新操作员创建对象会导致未解决的外部符号错误C FTGL
- 使用新关键字创建的C 对象不会呈现;在堆栈上创建的对象确实可以
- 将 QFile::copy 创建创建文件的副本或将内容从一个文件移动到另一个文件
- 部分模板绑定,将新模板创建为类型
- 管理用新char*创建但用自定义分配器分配给std::vector元素的内存块