我有一个控制台应用程序(让我们称之为主机),它使用System.Diagnostics.Process管理多个应用程序。主机控制这些外部进程的启动和停止。
当向控制台发出Ctrl + C(SIGINT)时,主机应该安全地终止其他进程。问题是其他进程也会收到Ctrl + C并立即终止,然后主机才能安全关闭它们。
我知道Ctrl + C是发给控制台进程树中的每个进程的。如果主机仍在启动并运行,我该怎么做才能阻止Ctrl + C到达其他进程?我没有参与其他进程的开发,因此无法直接更改其对Ctrl + C的处理。 感谢
答案 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();
}