5

我有一个控制台应用程序(我们称之为主机),它使用 System.Diagnostics.Process 管理多个应用程序。主机控制这些外部进程的启动和停止。

当向控制台发出 Ctrl+C (SIGINT) 时,主机应该安全地终止其他进程。问题是其他进程也收到 Ctrl+C 并在主机能够安全关闭它们之前立即终止。

我知道 Ctrl+C 是向控制台进程树中的每个进程发出的。如果主机仍在运行,我该怎么做才能防止 Ctrl+C 到达这些其他进程?我没有参与其他进程的开发,所以不能直接改变它们对Ctrl+C的处理。谢谢

4

2 回答 2

4

显然,您可以设置Console.TreatCtrlCAsInput = true哪个允许您处理该击键,停止其他进程,然后退出自己。根据MSDN 文档,此属性...

获取或设置一个值,该值指示将 Control 修饰键和 C 控制台键 (Ctrl+C) 的组合视为普通输入还是操作系统处理的中断。

于 2013-11-01T14:37:45.027 回答
1

详细说明标记为正确的答案。

设置 Console.TreatCtrlCAsInput 将阻止 SIGINT 信号命中控制台进程树中的所有进程,而是将带有控制修饰符的 C 键发送到终端中运行的应用程序。

在代码中,这看起来像:

static void Main(string[] args)
{
    System.Console.TreatControlCAsInput = true;

    // start the server
    Server server = new Server();
    server.Start();

    // wait for Ctrl+C to terminate
    Console.WriteLine("Press Ctrl+C To Terminate");
    ConsoleKeyInfo cki;
    do
    {
        cki = Console.ReadKey();
    } while (((cki.Modifiers & ConsoleModifiers.Control) == 0) || (cki.Key != ConsoleKey.C));

    // stop the server
    server.Stop();
}
于 2013-11-01T20:38:39.423 回答