[英]Under what circumstances does the read() syscall return 0?
我正在查看 Unix 中的read
系統調用,它(至少在 Linux 中)具有以下簽名:[1]
ssize_t read(int fd, void* buf, size_t count);
讓我們假設調用成功(即沒有負返回值)並且count > 0
(即緩沖區實際上可以存儲非零字節數)。 在什么情況下read()
返回 0? 我可以想到以下幾點:
fd
引用常規文件並且已到達文件末尾時。fd
指的是管道、套接字或 FIFO 的接收端時,發送端已經關閉並且管道/套接字/FIFO 自己的緩沖區已經耗盡。fd
指的是ICANON
中的終端設備的從端並且Ctrl-D
已發送到主端時,而行緩沖區為空。 我很好奇是否還有其他我不知道的情況,其中read()
將返回 0 結果。我對上面列表中的最后一種情況特別感興趣(由於原因) ,其中read()
返回 0 一次,但隨后在同一 FD 上調用read()
可能返回非零結果。 如果答案僅適用於某種風格的 Unix,我仍然有興趣聽到它。
[1] 我知道這個簽名是用於 libc 包裝器的,而不是實際的系統調用,但這現在並不重要。
通常返回值0
總是意味着文件結束。 但是,如果您指定0
作為要讀取的字節數,除非檢測到錯誤,否則它將始終返回0
。
終端設備是一個特例。 如果終端處於熟模式,輸入Control-d 會告訴設備驅動程序立即從任何掛起的read()
返回輸入編輯緩沖區中的任何內容,而不是等待用戶輸入換行符。 如果緩沖區為空,則會導致讀取長度為零。 這就是在行首輸入 EOF 字符被應用程序自動視為 EOF 的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.