Может ли read() завершиться с ошибкой EINTR при чтении из обычного файла

Насколько я помню, read() нельзя прервать по сигналу и вернуть с errno=EINTR при чтении из обычного файла, а также write() при записи в обычный файл.

Это противоположно чтению или записи на терминалы, каналы, сокеты и т. д.

Это правильно в Linux?

Это предписано POSIX?

РЕДАКТИРОВАТЬ: Предположим, что мы говорим о прерывании сигналом, который не настроен на автоматический перезапуск системных вызовов.


person Kristian Spangsege    schedule 05.02.2016    source источник


Ответы (1)


С практической точки зрения, большинство программ ожидают такого поведения, но если бы EINTR действительно имел место, код результата указывал бы, сколько байтов было фактически прочитано, может быть, ноль. Поэтому, если вы закодировали защитный код для правильной обработки короткого чтения (с циклом для продвижения указателя на n, повторите попытку с len - n), то вы даже не заметите. По этой причине я всегда зацикливаю чтение по сети. А поскольку все является файлом, вы не можете знать, что ваш вызывающий абонент не предоставил вам TCP-соединение, поэтому лучше всего ожидать коротких чтений.

Я не юрист по спецификациям, поэтому мне все равно, что говорит спец. На самом деле этого не происходит... если только это не происходит.

person Jeff Allen    schedule 06.02.2016
comment
Джефф, я думаю, вы говорите здесь о коротких чтениях, о чем мой вопрос. Мой вопрос о прерывании, прежде чем что-либо будет прочитано. Обратите внимание, что read() может завершиться ошибкой только с EINTR, если вообще ничего не было прочитано. Если что-то было прочитано (короткое чтение), read() должно завершиться успешно. - person Kristian Spangsege; 08.02.2016
comment
Есть ли также правило, согласно которому вы никогда не сможете получить краткое чтение из обычного файла, это интересный вопрос, но я задаю здесь не этот вопрос. - person Kristian Spangsege; 08.02.2016