Предотвращение Ctrl-C от закрытия программы - PullRequest
0 голосов
/ 02 октября 2011

Это расширение вопроса, который я задавал ранее. Переопределить 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 Ответ

1 голос
/ 02 октября 2011

Вы пробовали signal(SIGINT, SIG_IGN);?

Я предполагаю, что будет работать


Edit:

Я вернулся и немного уменьшил вашу программу, и обработчик, кажется, работает (каждый вызов увеличивает флаг), но фактический системный вызов (сон в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...