【问题标题】:How to send a control-break (or equivalent signal) to console application process in .NET?如何在.NET 中向控制台应用程序进程发送控制中断(或等效信号)?
【发布时间】:2013-04-19 19:19:24
【问题描述】:

假设我启动一个进程来运行像 7z.exe (7-Zip Archiver) 这样的控制台应用程序。我正在创建没有窗口的进程,并且正在重定向标准输出。

我想知道如何停止“Process.Kill”以外的进程,因为这会导致留下不完整/损坏的存档文件。

如果我在从普通命令控制台窗口运行 7z.exe 时按 CTRL-BREAK,它会正常关闭并删除不完整的文件。

如果 cmd.exe 可以启动进程并向其发送 ctrl-break 信号,那么我自己的应用程序如何启动进程并向其发送 ctrl-break(或等效)信号,以便进程正常关闭?

【问题讨论】:

  • 我之前读过...你需要一个中间人进程来让 GenerateConsoleCtrlEvent 工作,因为它实际上只适用于调用进程,尽管它似乎接受任意进程组 id .该链接问题中的答案解释得更好一些,所以我会尝试一下。

标签: c# .net console-application interrupt break


【解决方案1】:

如果需要,您可以执行 thread.sleep 来暂停它。如果你想完全停止它,我会设置一个监视变量,然后暂停你的线程,处理任何现有数据(这可能是 7zip 正在做的),然后执行 process.kill。我认为没有(或不知道)一种方法可以“优雅地”自动处理中止进程。由你,程序员,优雅地处理中断的退出条件。

【讨论】:

  • 7-Zip 响应 ctrl+break 或 ctrl+c 专门优雅地关闭。这是给定的。手头的问题是如何从启动它的进程发送信号。 GenerateConsoleCtrlEvent 专门用于此目的,但即使 7z.exe 在新进程组中运行,并且无论它是否使用控制台窗口创建(create_no_window、create_new_console 或 detached_process 进程创建标志),它也只是不起作用。应用程序永远不会收到信号,也不会像正常情况下响应此类信号那样关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
相关资源
最近更新 更多