我应该覆盖Ctrl``C信号并使用它来打印消息。它不应该结束程序。
Ctrl``C
到目前为止,所发生的是,当Ctrl``C按下它时,它会打印消息,但会结束程序。
当我问我的教授时,他告诉我要这样做:您需要使信号处理程序不要继续处理信号。现在,信号正在由您的代码处理,然后转到父处理程序。
我应该添加一种方法还是需要将信号安装程序移动到某个地方?
到目前为止,这是我的代码:
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <signal.h> #include "Input.h" #include "CircleBuff.h" //void handler_function(int signal_id); void catch_int(int sig_num){ //reset the signal handler again to catch_int, for next time signal(SIGINT, catch_int); //print message printf("Print History"); fflush(stdout); } void printHistory(CircleBuff hist){ cout << "Complete History:\n" << endl; hist.print(); cout << endl; } int main(int argc, char** argv){ struct sigaction signal_action; /* define table */ signal_action.sa_handler = catch_int; /* insert handler function */ signal_action.sa_flags = 0; /* init the flags field */ sigemptyset( &signal_action.sa_mask ); /* are no masked interrupts */ sigaction( SIGINT, &signal_action, NULL ); /* install the signal_action */ do{ //My code: where the value report will be assigned within. } while(report != 1) }
哇, 方式 太多的代码去筛选。但是,如果使用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),并且信号处理程序不会被替换,因此它将每次触发,并且没有人终止程序。
Ctrl-C
SIGINT
请注意,信号处理程序由fork()ed子级继承。
fork()
Posix函数sigaction()使您可以注册一次调用的“一次性”处理程序,这些处理程序将由标准处理程序替换。但是,这是更高级且特定于Posix的。
sigaction()
编辑: 正如@Dietrich指出的那样,您永远不应 在 信号处理程序 内 做任何实际工作。相反,您应该设置一个标志(我提供了一个示例),并在循环中检查该标志(并在其中打印消息)。我也将修改示例。