Кажется, что добавление -H
или -S
в конце приводит к тому, что он сообщает, а не устанавливает. И поэтому никакой ошибки. Число в конце, кажется, игнорируется. Насколько я могу судить, это должна быть ошибка использования, но не ошибка ограничений.
Да, в Linux всегда безопасно перезапустить системный вызов, который вернулся с EINTR
:, это возвращаемое значение означает, что системный вызов был прерван до того, как он сделал какой-либо полезный прогресс, и его следует перезапустить. Реализация системного вызова учитывает это.
Случаи, когда состояние системы изменилось из-за прерванного системного вызова, обрабатываются по-разному; например, вызов read
, который извлек некоторые данные до того, как он был прерван, вернет эти данные, указывая на успех, а вызов write
, который передал некоторые данные до того, как он был прерван, вернет объем записанных данных, что также указывает на успех.. (Между прочим, это одна из причин, по которой важно проверять возвращаемые значения этих функций, а не предполагать, что успешные вызовы выполнили всю запрошенную работу.)
Многие системные вызовы могут быть автоматически перезапущены путем установки флага SA_RESTART
для соответствующих сигналов. Библиотека GNU C предоставляет макрос, который может помочь написать код перезапуска,TEMP_FAILURE_RETRY
в unistd.h
(, определенный, если _GNU_SOURCE
определен ).
Обратите внимание, что в Linux системные вызовы могут возвращать EINTR
даже без обработчика сигнала.
Раздел «Прерывание системных вызовов и библиотечных функций обработчиками сигналов» вman 7 signal
содержит все подробности, включая списки затронутых системных вызовов в различных сценариях.