Я просматриваю 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, а не для самонастройки, но это не важно сейчас.