2009-11-01 33 views
0

我有一個控制檯程序,我想如果用戶按下ctrl-z該程序退出,並且如果他按下ctrl-c沒有任何反應。在Bash中,我把一個陷阱,我應該在C++中使用?「陷阱」控制-d和控制-c

+0

您的控制檯程序是否具有比通常的stdin/stdout處理器更復雜的UI?是什麼類型? – Juliano

+0

不,這很簡單 – Hai

回答

5

在Unix中使用signal()<signal.h>來註冊一個函數來調用接收信號。

例如:

#include <signal.h> 

void leave(int sig); 

// ... 
{ 
    signal(SIGINT,leave); 
    for(;;) getchar(); 
} 

// Beware: calling library fn from signal handler isn't std-conforming 
//   and may not work. 
void leave(int sig) 
{ 
    exit(sig); 
} 
+1

你應該在這裏調用'_Exit(sig)'而不是'exit(sig)'。前者在信號處理程序內是安全的,後者不是。 –

+3

'signal()'在不同的平臺上表現不同。 'sigaction()'稍微複雜一些,但是便攜。 –

1

當然,這是特定平臺。 C++本身並不知道鍵盤輸入或信號處理。

正如你提到的bash,我想你是在Linux或某種UN * X上。在這種情況下,請看signal.h

+0

C和C++標準都有很多關於信號處理和鍵盤輸入的說法。雖然沒有太多的關於處理暫停的說法,但是'SIGINT'和'signal()'都被覆蓋了。 –

+0

我不認爲C或C++語言假定甚至有鍵盤。但是你是對的,'SIGINT'和'signal()'都是C標準頭文件'signal.h'的一部分,這意味着你可以設置信號處理函數和提升信號。 – mkluwe

4

如果您使用的是基於UNIX的系統,那麼您需要signal()sigaction(),具體取決於您的偏好和線程模型;親自,我會推薦sigaction()超過signal()。你想陷阱SIGTSTPSIGINT。閱讀the Signal Concepts section of the Single UNIX Specification瞭解如何使用它們。

如果您有空閒時間,請閱讀W. Richard Steven的經典作品Advanced Programming in the UNIX Environment。你永遠不會後悔。如果您希望執行更多的UNIX系統編程任務,那麼也應該選取POSIX Programmers GuidePOSIX.4 Programmers Guide的副本。他們作爲偉大的介紹和參考。