檔案與輸入輸出

open、read、write、close 系統呼叫

想像在用一個檔案櫃。首先你把抽屜拉開。然後你把文件拿出來(讀取)或放進去(寫入),一次一把。做完之後,你把抽屜推回關上,好讓下一個人能用這個櫃子。這四個動作——開啟、讀取、寫入、關閉——就是類 Unix 系統上原始檔案 I/O 的全部詞彙。

這些是系統呼叫:你請求核心去做這些工作,因為只有核心能碰觸磁碟與開啟檔案的記錄。open(path, flags, mode) 找到或建立檔案,在你的檔案描述符表中設好一個項目,並回傳一個檔案描述符(一個小整數),出錯時回傳 -1。read(fd, buf, count) 從檔案目前的位置複製至多 count 個位元組到你的緩衝區 buf,並回傳它實際搬了多少(可能比你要求的少——這叫短讀)。write(fd, buf, count) 把至多 count 個位元組從 buf 複製出去寫進檔案,並回傳它接受了多少。close(fd) 告訴核心你用完了,讓那個描述符可以再被使用。read 與 write 都會把檔案偏移量往前推進實際搬移的位元組數,所以反覆呼叫就能走遍整個檔案。

為何重要:這是基石。標準函式庫那親切的 fopen/fread/fwrite,以及其他語言中更高階的檔案物件,全都是建立在這些呼叫之上。在這個原始層工作,你必須檢查每一個回傳值(-1 表示去看 errno),用迴圈來處理短讀與部分寫入,並記得把你開啟的東西關掉,否則就會洩漏描述符。回報則是與核心直接、可預測、無緩衝的接觸——這正是系統程式碼常常需要的。

int fd = open("out.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd < 0) { perror("open"); return 1; } write(fd, "hi\n", 3); close(fd);

以寫入方式開啟(不存在就建立、存在就清空),寫入三個位元組,然後關閉。永遠要檢查 open 的回傳值。

read() 回傳 0 表示檔案結尾,而不是錯誤;-1 才是錯誤訊號(去查 errno)。永遠不要假設 read 或 write 一次就搬完你要求的所有位元組——用迴圈,直到完成、遇到 EOF 或遇到錯誤。

又称
the basic I/O system callsraw I/O calls基本 I/O 系統呼叫