如何从子进程中的致命错误中拯救父进程

Posted

技术标签:

【中文标题】如何从子进程中的致命错误中拯救父进程【英文标题】:How to save parent process from fatal error in child process 【发布时间】:2021-11-25 01:34:07 【问题描述】:

我的目标是为 NET Core 隔离一些代码执行。

    我有一个控制台应用程序 #1(父级?),它为另一个控制台应用程序 #2(子级?)启动一个进程,然后运行动态编译的代码。 执行该代码可能会导致致命错误,例如 OutOfMemoryException。 发生这种情况时,应用程序 #1 和应用程序 #2 都会失败。

有没有办法从应用程序 #2 的失败中拯救应用程序 #1?

也许我误解了一些东西,但我认为这些应该是完全分开的。请帮忙。如果有的话,也会感谢 NET Framework 的解决方案。

        ProcessStartInfo processStartInfo = new ProcessStartInfo(filePath, processArgs)
        
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        ;

        using (Process process = new Process()
        
            StartInfo = processStartInfo,
            EnableRaisingEvents = true
        )
        
            process.Start();
            process.WaitForExit();

            return process.StandardOutput.ReadToEnd();
        ;

【问题讨论】:

子进程失败时父进程到底发生了什么? FWIW,我也希望他们能够独立。 在线程 #1 中尝试捕获线程 #2 引发的异常怎么样? @500-InternalServerError,两个应用程序都崩溃了,我收到有关失败的窗口弹出窗口。 @T.Trassoudaine,您是否建议从另一个线程运行应用程序 #2? 它说什么? 【参考方案1】:

所以,封装子应用程序的代码就足够了。即使在子应用程序中的OutOfMemoryException***ExceptionAccessViolationException 之后,父应用程序也会继续工作。

请记住,子应用程序可能需要一些时间才能完全释放崩溃后已使用的资源,因此其中一些资源可能仍被锁定在父应用程序中。

感谢各位大开眼界!

【讨论】:

以上是关于如何从子进程中的致命错误中拯救父进程的主要内容,如果未能解决你的问题,请参考以下文章

在nodejs中管道从子节点到父节点的数据

如何在 node.js 子进程模块中将消息和标准输出从子进程传递给父进程?

通过 npm 脚本生成时从子进程向父进程发送消息

访问共享进程内存时出现分段错误(核心转储)

C Pipe:父级在子级结束之前从子级读取

无法将子进程发送回父进程的消息