哇, 方式 太多的代码去筛选。但是,如果使用C标准库,则应获得所需的行为。这是C ++版本:
#include <iostream>#include <csignal>sig_atomic_t sigflag = 0;void sighandler(int s){ // std::cerr << "Caught signal " << s << ".n"; // this is undefined behaviour sigflag = 1; // something like that}int main(){ std::signal(SIGINT, sighandler); // ... your program here ... // example: baby's first loop (Ctrl-D to end) char c; while (std::cin >> c) { if (sigflag != 0) { std::cerr << "Signal!n"; sigflag = 0; } }}这将捕获
Ctrl-C(引发
SIGINT),并且信号处理程序不会被替换,因此它将每次触发,并且没有人终止程序。
请注意,信号处理程序由
fork()ed子级继承。
Posix函数
sigaction()使您可以注册一次调用的“一次性”处理程序,这些处理程序将由标准处理程序替换。但是,这是更高级且特定于Posix的。
编辑: 正如@Dietrich指出的那样,您永远不应 在 信号处理程序 内
做任何实际工作。相反,您应该设置一个标志(我提供了一个示例),并在循环中检查该标志(并在其中打印消息)。我也将修改示例。



