2013-11-01 74 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(); 
}