Я просматриваю read
syscall в Unix, который (по крайней мере, в Linux) имеет эту подпись: [1]
ssize_t read(int fd, void* buf, size_t count);
Предположим, что вызов преуспевает (т.е. Отрицательные значения возврата) и что count > 0
(т.е. Буфер фактически может хранить ненулевое количество байтов). При каких обстоятельствах будет read()
return 0? Я могу думать о следующем:
- Когда
fd
ссылается на обычный файл, и конец файла достигнут. - Когда
fd
относится к принимающему концу трубы, гнезда или FIFO, конец отправки был закрыт, а собственный буфер/внутренний/внутренний порт FIFO был исчерпан. - Когда
fd
ссылается на подчиненную сторону терминального устройства, которое находится вICANON
аCtrl-D
отправляется на главную сторону, в то время как буфер строки пуст.
Мне любопытно, есть ли другие ситуации, о которых я не знаю, где read()
вернется с результатом 0. Мне особенно интересно (по причинам) в ситуациях, подобных последнему в списке выше, где read()
возвращает 0 один раз, но последующие вызовы read()
на том же FD могут возвращать ненулевой результат. Если ответ относится только к определенному вкусу Unix, мне все равно интересно его услышать.
[1] Я знаю, что эта подпись предназначена для оболочки libc, а не для самонастройки, но это не важно сейчас.