Skip to Content
LINUX系統程式設計 第二版
book

LINUX系統程式設計 第二版

by Robert Love
December 2013
Intermediate to advanced
496 pages
8h 57m
Chinese
GoTop Information, Inc.
Content preview from LINUX系統程式設計 第二版
36
|
第二章
這個簡單的實作有兩個問題:
read()
呼叫可能在讀完
len
個位元組之前就先返回了,因
此可能會產生程式碼沒有檢查到以及無法處理的錯誤。遺憾的是,此類程式碼相當常
見。讓我們來看看如何改進它。
傳回值
read()
傳回小於
len
的非零正數並不算錯誤。發生此狀況的原因可能是:可供讀取的位
元組數目小於
len
、系統呼叫因為收到信號而發生中斷、導管斷了(如果
fd
所參照的是
導管)…等等。
使用
read()
時,傳回值為
0
的可能性是另一個應該考慮的因素。
read()
系統呼叫會傳回
0
以指示到達了
檔案末端
end-of-file
,常簡寫為
EOF
);此狀況下,當然沒有位元組可
供讀取。EOF 並不算錯誤(因此不會以
-1
做為傳回值);這表示檔案位置已經超過了檔
案中最後一個有效偏移值,因此沒有任何其他位元組可供讀取。然而,如果你以
read()
呼叫讀取
len
個位元組,但是可供讀取的位元組尚未出現,則此呼叫將受到阻擋(進入
休眠狀態)直到出現可供讀取的位元組(假定「檔案描述器」被開啟時並未進入非阻擋
模式;見第 2 章〈非阻擋式讀取操作〉一節)。注意,這不同於傳回 EOF。也就是說,
no data available」(資料尚未出現)與「end of data」(到達資料末端)並不相同。就
EOF 的情況而言,是指到達了檔案末端。就受阻檔的情況而言,讀取操作正在等待更多
的資料—例如,對一個 socket 或一個裝置檔進行讀取操作的情況。
有些錯誤是可復原的。舉例來說,如果進行
read()
呼叫時,卻在讀取任何位元組之前遭 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Start your free trial

You might also like

優雅的SciPy|Python科學研究的美學

優雅的SciPy|Python科學研究的美學

Juan Nunez-Iglesias, Stéfan van der Walt, Harriet Dashnow
C++语言导学(原书第2版)

C++语言导学(原书第2版)

本贾尼 斯特劳斯特鲁普

Publisher Resources

ISBN: 9789862769812