Системный вызов read
гарантированно прочитает столько символов, сколько вы просили, кроме случаев, когда это невозможно.Но оказывается, что существует так много исключений - так много случаев, когда он не может прочитать столько символов, сколько вы просили, - что в итоге оказывается безопаснее предположить, что любой данный вызов read
, вероятно, не будетпрочитайте столько символов, сколько вы просили.Я считаю хорошей практикой всегда писать ваш код, помня об этом.
Страница руководства в моей системе говорит:
Система гарантирует чтение количества запрошенных байтов, если дескрипторссылается на обычный файл, который имеет столько байтов до конца файла, но ни в каком другом случае.
Так что, если это не обычный файл, или если это обычный файл, нонедостаточно символов, вы получите меньше, чем вы просили.Но в случае, о котором вы спрашивали, да, вы должны быть уверены, что получите ровно столько символов, сколько просили.
Тем не менее, если вы окажетесь с выбором между предположением, что read
якобы гарантировано чтение именно того количества запрошенных символов, в отличие от подтверждения того, что он может вернуть меньше, я всегда писал бы код, предполагая, что он может вернуть меньше.То есть, если у вас есть вызов, подобный
r = read(fd, buf, n);
, обычно нечего получить, если предположить, что если r
больше 0, оно должно быть точно n
.Ваш код должен уметь обрабатывать случай r < n
, поэтому он будет вести себя правильно, когда он почти в конце файла, поэтому, если вы не хотите иметь два разных пути кода (один для «нормального» чтения и один дляПоследнее чтение), вы могли бы также написать один фрагмент кода, который может обрабатывать случай r < n
, и позволить ему работать все время.
(Также, как напоминает Zan Lynx в комментарии, некод не должен заметить, что r < n
, и сделать вывод, что скоро появится конец файла. Дождитесь r == 0
, прежде чем решить, что вы в конце файла.)