Безопасно ли перезапускать системные вызовы?

Кажется, что добавление -Hили -Sв конце приводит к тому, что он сообщает, а не устанавливает. И поэтому никакой ошибки. Число в конце, кажется, игнорируется. Насколько я могу судить, это должна быть ошибка использования, но не ошибка ограничений.

0
02.10.2020, 11:18
1 ответ

Да, в Linux всегда безопасно перезапустить системный вызов, который вернулся с EINTR:, это возвращаемое значение означает, что системный вызов был прерван до того, как он сделал какой-либо полезный прогресс, и его следует перезапустить. Реализация системного вызова учитывает это.

Случаи, когда состояние системы изменилось из-за прерванного системного вызова, обрабатываются по-разному; например, вызов read, который извлек некоторые данные до того, как он был прерван, вернет эти данные, указывая на успех, а вызов write, который передал некоторые данные до того, как он был прерван, вернет объем записанных данных, что также указывает на успех.. (Между прочим, это одна из причин, по которой важно проверять возвращаемые значения этих функций, а не предполагать, что успешные вызовы выполнили всю запрошенную работу.)

Многие системные вызовы могут быть автоматически перезапущены путем установки флага SA_RESTARTдля соответствующих сигналов. Библиотека GNU C предоставляет макрос, который может помочь написать код перезапуска,TEMP_FAILURE_RETRYв unistd.h(, определенный, если _GNU_SOURCEопределен ).

Обратите внимание, что в Linux системные вызовы могут возвращать EINTRдаже без обработчика сигнала.

Раздел «Прерывание системных вызовов и библиотечных функций обработчиками сигналов» вman 7 signalсодержит все подробности, включая списки затронутых системных вызовов в различных сценариях.

2
18.03.2021, 23:01

Теги

Похожие вопросы