Подтвердить что ты не робот

Обработка событий прерывания Ctrl + C в Linux

Я разрабатываю приложение, которое использует С++ и компилируется с использованием Linux GNU C Compiler. Однако я хочу вызвать функцию, поскольку пользователь прерывает script с помощью клавиш Ctrl C. Что мне делать? Любые ответы были бы высоко оценены.

4b9b3361

Ответ 1

Когда вы нажимаете Ctr + C, операционная система отправляет signal в процесс. Есть много сигналов, и один из них - SIGINT. SIGINT ( "прерывание программы" ) является одним из сигналов завершения.

Есть еще несколько видов сигналов терминации, но интересная вещь о SIGINT заключается в том, что ваша программа может обрабатываться (пойматься). Действие SIGINT по умолчанию - это завершение программы. То есть, если ваша программа специально не обрабатывает этот сигнал, при нажатии Ctr + C ваша программа завершается как действие по умолчанию.

Чтобы изменить действие по умолчанию для сигнала, вам необходимо зарегистрировать сигнал, который нужно поймать. Для регистрации сигнала в программе на C (по крайней мере, в системах POSIX) существуют две функции

Эти функции требуют, чтобы заголовок signal.h включался в ваш код C. Ниже приведен простой пример функции signal с комментариями.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> //  our new library 
volatile sig_atomic_t flag = 0;
void my_function(int sig){ // can be called asynchronously
  flag = 1; // set flag
}

int main(){
  // Register signals 
  signal(SIGINT, my_function); 
  //      ^          ^
  //  Which-Signal   |-- which user defined function registered
  while(1)  
    if(flag){ // my action when signal set it 1
        printf("\n Signal caught!\n");
        printf("\n default action it not termination!\n");
        flag = 0;
    }     
  return 0;
}  

Примечание: вы должны вызывать только безопасные/авторизованные функции в обработчике сигналов. Например избежать вызова printf в обработчике сигналов.

Вы можете скомпилировать этот код с помощью gcc и выполнить его из оболочки. В коде есть бесконечный цикл, и он будет работать до тех пор, пока вы не отправите сигнал SIGINT, нажав Ctr + C.

Ответ 2

Ввод Ctrl C обычно заставляет оболочку отправлять SIGINT в вашу программу. Добавьте обработчик для этого сигнала (через signal(2) или sigaction(2)), и вы можете делать то, что вам нравится, когда нажата Ctrl C.

В качестве альтернативы, если вы только заботитесь о том, чтобы выполнить очистку до выхода вашей программы, настройка обработчика выхода через atexit(3) может быть более уместной.

Ответ 3

Вы можете использовать сигнальный макрос.

Вот пример того, как с этим бороться:

#include <signal.h>
#include <stdio.h>
void sigint(int a)
{
    printf("^C caught\n");
}
int main()
{
    signal(SIGINT, sigint);
    for (;;) {}
}

Пример вывода:

Ethans-MacBook-Pro:~ phyrrus9$ ./a.out
^C^C caught
^C^C caught
^C^C caught
^C^C caught
^C^C caught