阻止Ctrl-C关闭程序

时间:2011-10-02 02:13:29

标签: c++ c linux signals

这是我之前提出的问题的扩展。 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);
}

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;
}