2016-12-11 8 views
0
#include <iostream> 
#include <csignal> 

void handler(int signo){ 
    std::cout << "Caught " << (signo == SIGINT) << std::endl; 
} 

int main(){ 
    signal(SIGINT, handler); 
    while(true) ; 

} 

В Windows и Linux это, кажется, сделать две разные вещи, когда я нажимаю Cntrl + Cмножественным раз. В Linux я увижу пойманное сообщение несколько раз, тогда как в Windows я увижу пойманное сообщение один раз, а при втором нажатии Cntrl + C моя программа закроется. Точно так же обработчики должны улавливать сигнал только один раз или бесконечно? Или есть свойство Windows, которое мне не хватает, что заставляет программу закрываться при втором нажатии?Являются ли обработчики сигналов бесконечными?

As far as I can tellCntrl + C рассматривается как SIGINT на Windows, так же, как это на Linux.

+0

Вы читали https://msdn.microsoft.com/en-us/library/xdkz3x12.aspx –

+0

@latedeveloper Спасибо, я смотрел документацию cppreference.com, которая не упоминала об этом. Соответствующая строка: «_Для выполнения указанной функции значение func устанавливается в SIG_DFL_» – SergeantPenguin

+0

Обратите также внимание на то, что в Windows обработчик SIGINT запускается в отдельном потоке. –

ответ

2

Это зависит от реализации signal, что может быть эквивалентно sigaction с флагом SA_RESETHAND установки или очистки - либо является приемлемым Accoding стандартам POSIX и С.

Для того, чтобы настроить это поведение, необходимо использовать только sigaction, а не signal, чтобы настроить обработчик сигналов и установить флажки, чтобы получить желаемое поведение.

+1

Кроме того, небезопасно использовать std :: cout в обработчике сигнала posix. Список безопасных функций приведен здесь: http://man7.org/linux/man-pages/man7/signal.7.html –