как управлять EINTR errno в sem_timedwait - PullRequest
0 голосов
/ 21 октября 2010

Можете ли вы помочь мне понять, почему рекомендуется использовать:

while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
    continue; // Restart when interrupted by handler

(EINTR: вызов был прерван обработчиком сигнала)

Вместопросто:

s = sem_timedwait(&sem, &ts);

В каких случаях я должен управлять EINTR?

1 Ответ

2 голосов
/ 21 октября 2010

Цикл вызовет перезапуск системного вызова, если во время выполнения системного вызова будет обнаружен сигнал, поэтому он не перейдет к следующему оператору, если системный вызов либо не завершился успешно, либо завершился неудачей (с некоторой другой ошибкой).).В противном случае поток продолжит выполнение со следующей инструкцией, когда системный вызов будет прерван обработчиком сигнала.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...