Я разрабатываю приложение, которое использует С++ и компилируется с использованием Linux GNU C Compiler. Однако я хочу вызвать функцию, поскольку пользователь прерывает script с помощью клавиш Ctrl C. Что мне делать? Любые ответы были бы высоко оценены.
Обработка событий прерывания Ctrl + C в Linux
Ответ 1
Когда вы нажимаете Ctr + C, операционная система отправляет signal в процесс. Есть много сигналов, и один из них - SIGINT. SIGINT ( "прерывание программы" ) является одним из сигналов завершения.
Есть еще несколько видов сигналов терминации, но интересная вещь о SIGINT заключается в том, что ваша программа может обрабатываться (пойматься). Действие SIGINT по умолчанию - это завершение программы. То есть, если ваша программа специально не обрабатывает этот сигнал, при нажатии Ctr + C ваша программа завершается как действие по умолчанию.
Чтобы изменить действие по умолчанию для сигнала, вам необходимо зарегистрировать сигнал, который нужно поймать. Для регистрации сигнала в программе на C (по крайней мере, в системах POSIX) существуют две функции
- signal (int signum, обработчик sighandler_t);
- sigaction (int signum, const struct sigaction * act, struct sigaction * oldact);.
Эти функции требуют, чтобы заголовок 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