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