C#阻止ctrl-c到子进程

时间:2013-11-01 14:13:29

标签: c# system.diagnostics

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

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

我知道Ctrl + C是发给控制台进程树中的每个进程的。如果主机仍在启动并运行,我该怎么做才能阻止Ctrl + C到达其他进程?我没有参与其他进程的开发,因此无法直接更改其对Ctrl + C的处理。 感谢

2 个答案:

答案 0 :(得分:4)

Apparently您可以设置Console.TreatCtrlCAsInput = true,这将允许您处理该击键,停止其他进程,然后退出自己。根据{{​​3}},这个属性......

  

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

答案 1 :(得分: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();
}