这是我之前提出的问题的扩展。 Override 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"
sig_atomic_t sigflag = 0;
void catch_int(int sig_num) {
sigflag = 1;
//printf("to do: Print history");
}
void printHistory(CircleBuff hist) {
cout << "Complete History:\n" << endl;
hist.print();
cout << endl;
}
int main(int argc, char** argv) {
signal(SIGINT, catch_int);
//my code here
do {
//more code here
if (sigflag != 0) {
printHistory(history);
sigflag = 0;
}
} while(report != 0); //which is assigned in the code
以下是简化代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
sig_atomic_t sigflag = 0;
void catch_int(int sig_num) {
sigflag = 1;
printf("to do: Print history");
}
int main(int argc, char** argv) {
signal(SIGINT, catch_int);
do {
} while(1);
}
答案 0 :(得分:1)
你试过signal(SIGINT, SIG_IGN);
吗?
我认为这样可行
编辑:
我回去了,稍微减少了你的程序,处理程序似乎工作 (每个invokation都会增加标志),但实际的系统调用(在mycase中休眠)将被中止。
你可以在这个简化的样本中重新测试并重申那些不适合你的东西吗?
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
volatile sig_atomic_t ctrlCcount = 0;
void catch_int(int sig_num){
ctrlCcount++;
}
int main(int argc, char** argv){
signal(SIGINT, catch_int);
do{
sleep(5);
printf("Ctrl-C count=%d\n", ctrlCcount);
}while(1);
return 0;
}