Рассмотрим следующую тестовую программуSIGINT сброса обработчика в Visual C++ 2015
#include <csignal>
#include <iostream>
volatile std::sig_atomic_t signal_raised = 0;
void set_signal_raised(int signal) {
signal_raised = 1;
}
void check(std::sig_atomic_t expected) {
if (signal_raised != expected) {
std::cerr << signal_raised << " != " << expected << std::endl;
abort();
}
}
int main() {
using namespace std;
check(0);
std::signal(SIGINT, set_signal_raised);
check(0);
std::raise(SIGINT);
check(1);
signal_raised = 0;
check(0);
std::raise(SIGINT);
check(1);
cerr << "OK.\n";
}
С GCC и Clang, он выводит "OK". Однако с Visual Studio 2015 он ничего не выводит.
Обработчик сигнала сбрасывается после обработки первого сигнала. Это можно проверить, добавив
auto prev = std::signal(SIGINT, set_signal_raised);
if (prev != set_signal_raised) {
std::cerr << "Unexpected handler." << std::endl;
abort();
}
к функции проверки. Это разрешено и ожидается?
Я не могу увидеть что-нибудь в С11, позволяя поведение VS в. Тем не менее, это не исключает возможности его запретить. –