2009-11-01 37 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的副本。他们作为伟大的介绍和参考。