Поэтому, если я должен написать "блокировку" 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;
}