【问题标题】:Process management in .NET.NET 中的进程管理
【发布时间】:2010-09-18 14:39:35
【问题描述】:

所以我有一个用 C++ 编写的辅助进程,我打开它,向它提供参数,然后它通过标准输出流向我的程序反馈信息。

PS。我没有辅助进程 exe 的源代码。

如果我的应用程序要从任务管理器中终止,或者由于某种原因崩溃,我如何确保我的助手 exe 已关闭?这可能吗?我需要一个外部文件吗?

【问题讨论】:

  • C# 还是 C++?您的标题、描述和标签令人困惑。
  • 主程序为C#,辅助exe为C++

标签: c# process


【解决方案1】:

使用Job Objects 管理进程组。在这种情况下,您想使用CreateJobObject 创建作业对象,使用SetInformationJobObject 设置JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 标志,并使用AssignProcessToJobObject 将帮助进程分配给作业。不要关闭作业对象的句柄,除非您想终止辅助进程。当您的进程终止(通过任何方式)时,句柄将被关闭并且您的辅助进程将被杀死。

【讨论】:

  • 不错的答案,但请不要发布特定于版本的 MSDN 链接,除非信息是特定于版本的。
【解决方案2】:

您应该创建父进程句柄的可继承副本,并将其值传递给命令行上的辅助进程。然后,辅助进程可以在一个单独的线程(或者如果你聪明的话,可以在主线程)上等待该句柄。当句柄变为信号时,意味着启动过程已经终止。

编辑

由于您无法更改辅助进程,因此您的选择更加有限。您可以尝试将处理程序附加到启动过程的 OnAppDomainUnloaded 事件,但我不确定这是否适用于您担心的所有情况。您还可以创建第三个进程来监控第一个进程。这个过程会像我上面描述的那样工作。如果你想变得更花哨,你可以在辅助进程中注入一个远程线程来监控父进程。这是非常技术性的,所以我建议不要这样做。

【讨论】:

  • 您能详细介绍一下吗?
  • 好吧,我没有一个助手可执行文件的源代码。
  • 对不起。我完全错过了。我会修改我的答案。
【解决方案3】:

最简单的方法是在正常的应用程序退出和调用 AppDomain.CurrentDomain.UnhandledException 时关闭它(即您的应用程序即将崩溃)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多