Способ чтения () зависит от того, что читается.Для обычных файлов, если вы запрашиваете N символов, вы получите N символов, если они доступны, меньше N, если конец файла вмешивается.
Если read () читает с терминала в каноническом / готовом режиме,Драйвер tty предоставляет данные по одной строке за раз.Поэтому, если вы скажете read (), чтобы получить 3 символа или 300, read будет зависать до тех пор, пока драйвер tty не увидит новую строку или определенный ключ EOF терминала, а затем read () вернется либо с количеством символов в строке, либо сколичество запрошенных вами символов, в зависимости от того, какое из значений меньше.
Если read () читает с терминала в неканоническом / необработанном режиме, чтение сразу же получит доступ к нажатиям клавиш.Если вы попросите read () получить 3 символа, он может вернуть от 0 до 3 символов в зависимости от времени ввода и конфигурации терминала.
read () будет вести себя по-разному в условиях сигналов, возвращаяс меньшим, чем запрошенное количество символов, или -1 с errno, равным EINTR, если сигнал прервал чтение до того, как поступили какие-либо символы.
read () будет вести себя по-другому, если дескриптор настроен для неблокированияI / O.read () вернет -1 с errno, установленным в EAGAIN или EWOULDBLOCK, если вход не был немедленно доступен.Это относится и к сокетам.
Итак, как вы можете видеть, вы должны быть готовы к неожиданностям, когда вызываете read ().Вы не всегда получите количество запрошенных вами символов, и вы можете получить нефатальные ошибки, такие как EINTR, что означает, что вы должны повторить read ().