Цикл вызовет перезапуск системного вызова, если во время выполнения системного вызова будет обнаружен сигнал, поэтому он не перейдет к следующему оператору, если системный вызов либо не завершился успешно, либо завершился неудачей (с некоторой другой ошибкой).).В противном случае поток продолжит выполнение со следующей инструкцией, когда системный вызов будет прерван обработчиком сигнала.
Например, если вы хотите прервать этот sem_timedwait()
, отправив конкретный сигнал потоку, то вы бы не хотели безоговорочно перезапускать системный вызов.Вместо этого вы можете отметить, что операция была прервана, и очистить.Если у вас есть несколько обработчиков сигналов, обработчик сигналов может установить флаг, который можно проверить при обнаружении EINTR
, чтобы определить, следует ли перезапустить системный вызов.
Это имеет значение, только если поток перехватывает какие-либо сигналыс использованием обработчика сигнала, а флаг sigaction()
SA_RESTART
не использовался для автоматического перезапуска прерванного системного вызова.Однако, если вы не используете какие-либо обработчики сигналов и не предполагаете, что обработчик сигналов будет влиять на ваш код, все равно рекомендуется использовать цикл, чтобы он продолжал работать так, как вы предполагали, даже если ваш код более поздний.используется в той же программе, что и другой код, который использует обработчики сигналов для несвязанных целей.