Как обнаружить, когда прервано?

Так что, если бы я написал функцию «блокирования» (или просто функцию, выполнение которой может занять много времени) на C / C ++, как бы я мог определить, была ли прервана обработка, чтобы я мог вернуть что-то вроде EINTR-подобных вызовов такие как send а также recv делать. Я попытался искать вокруг и не понял, как определить, прерывается ли звонок. Или это может сделать только системный вызов? Если так, то почему?

0

Решение

Добавьте флаг, чтобы указать, что произошло прерывание:

volatile std::sig_atomic_t processing_interrupted = false;

И функция обработки прерывания для его установки:

extern "C" void interrupt_processing( int ) {
processing_interrupted = true;
}

Установите и контролируйте обработчик прерываний, пока он действителен, затем удалите его:

int do_processing() {
processing_interrupted = false;
std::signal( SIGINT, & interrupt_processing );

// Do something for a long time.

// Check flag periodically:
if ( processing_interrupted ) return EINTR;

std::signal( SIGINT, SIG_DFL );
return 0;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]