Так что, если бы я написал функцию «блокирования» (или просто функцию, выполнение которой может занять много времени) на C / C ++, как бы я мог определить, была ли прервана обработка, чтобы я мог вернуть что-то вроде EINTR-подобных вызовов такие как send
а также recv
делать. Я попытался искать вокруг и не понял, как определить, прерывается ли звонок. Или это может сделать только системный вызов? Если так, то почему?
Добавьте флаг, чтобы указать, что произошло прерывание:
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;
}
Других решений пока нет …