read 系統呼叫為什麼返回 int

2021-07-09 20:04:02 字數 659 閱讀 9600

read 是作業系統提供的乙個系統呼叫。該呼叫讀取流中的乙個位元組,返回乙個 int;這裡可以一**竟。

早期的時候,作業系統設計者認為位元組大於等於0,故使用 -1 作為流結尾標誌符。而且定義了乙個位元組就是乙個 byte,在記憶體中使用八位表示。這樣,乙個 byte 就只能表示0到127對應的編碼,顯然不夠用,聰明的設計者們使用了這乙個辦法:允許 byte 為負,表示編碼的補碼,如 -128 表示 編碼 128 ,-127 表示編碼 129,...... -1 表示 255。於是 byte 表示的編碼的範圍就變成了 0 到 255,對應 [0,127] u [-128,-1]。

那麼問題來了,如果 read 呼叫返回 byte 資料型別,而 byte 可以為 -1,那麼,當返回 -1 時,到底是說流已經 eof (end of file)了,還是當前讀到了乙個有效的字元 255(-1)?於是又作了這樣的設計:讓 read 返回 int,當大於等於 0 時,表示讀到了有效的位元組,當返回 -1 表示讀到了流末尾。read 返回的大於 127 的位元組就對應於它們取負的補碼。設返回值為 c,則取它的低八位就是表示的編碼,也即 c & 0xff 或 (byte)c。

這裡要注意一下:系統呼叫必須通過軟中斷機制首先進入系統核心,然後才能轉向相應的命令處理程式。普通過程呼叫可以直接由呼叫過程轉向被呼叫過程。所以要避免多次呼叫 read,而應該一口氣讀多個位元組。

read系統呼叫

read系統呼叫是glibc庫裡面的乙個函式,是對系統呼叫函式sys read 的封裝與實現。glic庫會將read函式在使用者態下進行解析,通過暫存器將引數儲存起來,並借助於系統呼叫名稱獲得系統呼叫號,該系統呼叫號又可以作為系統呼叫函式在sys call table中的索引獲取函式入口位址,該錶位...

系統呼叫read()的返回錯誤場景

ssize t read int fd,void buf,size t count 從檔案描述符fd中讀取count個位元組的資料放入buf的緩衝區中。返回值 成功返回讀取到的位元組數 count為0,read 返回0 eintr 在讀取到資料以前呼叫被訊號所中斷.eagain 使用 o nonbl...

read系統呼叫,mmap系統呼叫

read系統呼叫,mmap系統呼叫 2012 07 23 09 54 28 分類 linux 標籤 linux 檔案系統 虛擬記憶體 儲存系統 字型大小 訂閱 一般情況下,操作檔案既可以使用標準i o,也可直接使用系統呼叫。兩者有何區別呢?在輸入輸出中,直接使用底層的系統呼叫效率是非常低的,為什麼?...