2013-11-01 47 views
4

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

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

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

回答

4

Apparently您可以设置Console.TreatCtrlCAsInput = true这将允许您处理该按键,停止其他进程,然后退出自己。根据MSDN docs,此属性...

获取或设置一个值,它指示控制修改键和C键的控制台(CTRL + C)的组合是否被作为普通输入或中断是处理由操作系统处理。

+0

我不知道是否有一个Win32API的类型的事情,你可以扎入处理这个问题。对我来说,这似乎更理想/更强大...... –

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(); 
}