Любой процесс может получать сигналов .Если этот процесс выполняет системный вызов, который блокирует процесс при получении сигнала, системный вызов не будет выполнен, и глобальному errno будет присвоено специальное значение EINTR
.Таким образом, процесс снова пробуждается и может предпринимать действия при получении сигнала.
Это не серьезный сбой, это в основном просто информация о том, что сигнал был получен, и можно снова безопасно выполнить тот же вызов.
Код здесь просто следует хорошей практике и обрабатывает такую потенциальную ситуацию.Поскольку код здесь не особо заботится о том, что сигнал был получен, он просто повторяет попытку получения семафора.
Примечание. Хотя большинство системных вызовов могут завершаться таким образом, большинство системных вызовов автоматически перезапускаются.,т. е. ваш собственный код никогда не видит, что вызов с EINTR не удался, система повторяет системный вызов еще раз.Это поведение также можно контролировать, когда устанавливается обработчик сигнала при вызове sigaction()
.
sem-timedwait()
однако, это не вызов, который система автоматически перезапускает, поэтому ваш код должен с этим справиться.