Відповіді:
signal
не є найнадійнішим способом, оскільки він відрізняється реалізацією. Я б рекомендував використовувати sigaction
. Код Тома тепер виглядатиме так:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void my_handler(int s){
printf("Caught signal %d\n",s);
exit(1);
}
int main(int argc,char** argv)
{
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
pause();
return 0;
}
int s
як аргумент. sig_t
сам по собі тип покажчика функції.
printf()
не є безпечним для асинхронного сигналу, тому його не можна використовувати всередині обробника сигналу.
sa_mask
і sa_flags
.
Для програми консолі Windows потрібно використовувати SetConsoleCtrlHandler для обробки CTRL+ Cі CTRL+ BREAK.
Дивіться тут приклад.
Ви повинні зафіксувати сигнал SIGINT (ми говоримо POSIX правильно?)
Дивіться відповідь @Gab Royer щодо сигакції.
Приклад:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
void my_handler(sig_t s){
printf("Caught signal %d\n",s);
exit(1);
}
int main(int argc,char** argv)
{
signal (SIGINT,my_handler);
while(1);
return 0;
}
void my_handler(sig_t s)
до void my_handler(sig_atomic_t s)
.