signal () ведет себя по-разному, в зависимости от того, соответствует ли он стилю BSD или SysV. sigaction () предпочтительнее.
asveikau
2
Я знаю, что он старый, но он не компилируется в g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0. Пришлось сменить void my_handler(sig_t s)на void my_handler(sig_atomic_t s).
jcmonteiro
1
Да, это вопрос, зависящий от платформы.
Если вы пишете консольную программу на POSIX, используйте signal API ( #include <signal.h>).
В приложении WIN32 GUI вы должны обработать WM_KEYDOWNсообщение.
Ответы:
signal
не самый надежный способ, так как он отличается реализациями. Я бы порекомендовал использоватьsigaction
. Теперь код Тома будет выглядеть так:источник
int s
как аргумент.sig_t
сам по себе является типом указателя функции.printf()
не является безопасным для асинхронных сигналов, поэтому не может использоваться внутри обработчика сигналов.sa_mask
иsa_flags
.Для консольного приложения Windows вы хотите использовать SetConsoleCtrlHandler для обработки CTRL+ Cи CTRL+ BREAK.
Смотрите здесь для примера.
источник
Вы должны поймать сигнал SIGINT (мы ведь говорим о POSIX?)
См. Ответ @Gab Royer для подтверждения.
Пример:
источник
void my_handler(sig_t s)
наvoid my_handler(sig_atomic_t s)
.Да, это вопрос, зависящий от платформы.
Если вы пишете консольную программу на POSIX, используйте signal API (
#include <signal.h>
).В приложении WIN32 GUI вы должны обработать
WM_KEYDOWN
сообщение.источник