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

0

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

  • 0
    Это будет зависеть от функции блокировки. Будет ли функция использовать системные вызовы? Если все в пользовательском пространстве, вы можете просто обернуть функцию внутри класса с помощью state.
  • 0
    Только для дерьма и хихиканья, давайте предположим, что и с и без. И давайте предположим, что прямо C без классов. Кроме того, в тот момент он все равно не заставил бы функцию возвращаться сразу, даже если бы это был класс с состоянием, он все равно просто вернулся бы к выполнению рассматриваемой функции, нет?
Показать ещё 6 комментариев
Теги:
interrupt
interrupt-handling

1 ответ

1

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

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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню