簡體   English   中英

在什么情況下 read() 系統調用返回 0?

[英]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 包裝器的,而不是實際的系統調用,但這現在並不重要。

  • 如果物理文件系統不支持從目錄中簡單讀取,則 read() 將返回 0(如果它用於目錄)。
  • 如果沒有進程打開管道進行寫入,則 read() 返回 0 以指示文件結束。
  • 如果流套接字上的連接中斷,但沒有數據可用,則 read() 函數返回 0 字節作為 EOF。

通常返回值0總是意味着文件結束。 但是,如果您指定0作為要讀取的字節數,除非檢測到錯誤,否則它將始終返回0

終端設備是一個特例。 如果終端處於熟模式,輸入Control-d 會告訴設備驅動程序立即從任何掛起的read()返回輸入編輯緩沖區中的任何內容,而不是等待用戶輸入換行符。 如果緩沖區為空,則會導致讀取長度為零。 這就是在行首輸入 EOF 字符被應用程序自動視為 EOF 的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM