Ответ 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.