SIGINT (ctrl+c) не прерывает прием вызова

В бесконечном цикле я принимаю новые подключения, но мне нужен выбор, чтобы остановить этот сервер, поэтому я хочу использовать ctrl+c (SIGINT). Когда я нажимаю ее, он вызывает мой обработчик сигнала, но не прерывает вызов приема, поэтому проверка, если прерывание истинно, не оценивается (когда клиент не подключается, поэтому прием блокируется на долгое время).

sig_atomic_t interrupt;
.
.
.
signal(SIGINT, sigintHandler);
.
.
.
while(!interrupt) {
  server.accept();
}
.
.
.
void sigintHandler(int param) {
    interrupt = 1;
}

person Krab    schedule 25.03.2013    source источник


Ответы (1)


Ваша ОС по умолчанию использует семантику SA_RESTART при использовании signal(). Вы должны быть в состоянии подтвердить это на странице руководства. Поскольку вы не хотите, чтобы это произошло, используйте sigaction() для установки обработчика и опустите флаг SA_RESTART.

person jop    schedule 25.03.2013