基礎IO與檔案描述符

2021-08-13 09:53:52 字數 2738 閱讀 2728

一、引題

之前我們講過c標準庫提供的io函式fread,fwrite等,那麼它們到底是怎麼實現的呢?它們是真的靠自己寫出來的嗎?不一定?

我們先來看看關於作業系統的概念圖

功能:開啟

和建立檔案

引數:pathname:待開啟/建立檔案的路徑名 flags:開啟模式()

o_rdonly唯讀模式

o_wronly只寫模式

o_rdwr讀寫模式

以上三種常量必須選乙個,下面的是非必須選,下面這些和上面這些或(|)起來構成完整的開啟模式

o_creat如果指定檔案不存在,則建立這個檔案

o_excl如果要建立的檔案已存在,則返回-1,並且修改errno的值

o_trunc如果檔案存在,並且以只寫/讀寫方式開啟,則清空檔案全部內容(即將其長度截短為0)

o_noctty如果路徑名指向終端裝置,不要把這個裝置用作控制終端。

o_nonblock如果路徑名指向fifo/塊檔案/字元檔案,則把檔案的開啟和後繼i/o

返回值:成功則返回檔案描述符,否則返回-1

int open(const char *pathname, int flags, mode_t mode);

這個與上面基本一致,只是多了個標誌位 這個標誌位是用來創立新檔案時候,給新檔案定各個使用者許可權的

mode 是乙個是乙個無符號八進位制數,為什麼呢,這個就要和chmod聯絡起來,我們當初設定許可權數字的每一位代表一類許可權。使用者所獲得的許可權是加權數值的總和。例如764表示所有者擁有讀、寫和執行許可權,群組擁有讀和寫許可權,其他使用者擁有讀許可權。所以同樣的,這裡的mode也是同樣的意思。

ssize_t read(int fd, void *buf, size_t count);

功能:從檔案中讀資料

引數:fd:檔案描述符  buf:儲存資料的起始位址  count:指定的位元組數

返回值:成功返回讀文件的位元組數,失敗返回-1,當讀到eof,返回0

ssize_t write(int fd, const void *buf, size_t count);

功能:從開啟檔案中讀資料

引數:fd:檔案描述符  buf:指定緩衝區  count:指定的位元組數

返回值:成功返回寫文件的位元組數,失敗返回-1

by:注意write和read返回值型別是有符號長整型,這樣才可以返回負數,達到報錯的目的

二、檔案描述符

執行環境:

gcc (gcc) 4.4.7 

**:

#include #include #include #include //fd連續分配

void test1()

//fd從最小的開始分配

void test2()

int main()

test1()執行結果:

fd1 = 3 fd2 = 4

test2()執行結果:

fd1 = 3

fd2 = 3

從這兩個執行結果我們可以看出,fd按照從小到大依次分配下標,總是選擇在當前情況下最小的乙個下標進行分配,作為新的檔案描述符,但是我們又有了新的問題,為什麼從3開始分配呢?那0,1,2去幹嘛了,經過查詢,原來0,1,2分別對應著標準輸入,標準輸出,標準錯誤,linux程序預設情況下會開啟的檔案描述符

既然有了這個,那我們就可以利用這種特性改善過去的輸出和輸入

#include #include #include int main()

執行結果:

hello fd!

通過這裡,我們發現利用這種檔案描述符,也可以完成向螢幕輸入和列印的功能

#include int main()

printf("fd = %d\n",fd);

close(fd);

return 0;

}:

執行結果:

fd = 1

順便補充下,當我們關閉0,依然符合我們之前總結的,從第乙個空閒的最小的下標開始分配的規則。並且最為關鍵的是實現了重定向,這下相當於之前向螢幕輸出的資料,以後都會輸出到我們所建立的這個test.txt檔案中

注意事項:

open()過後,一定要記得close(),否則會造成資源洩漏,為什麼呢,這就需要談到檔案描述符,我們首先來看下面這張圖,了解下fd存在意義

我們將檔案描述符簡稱為fd,從這張圖,我們可以看出fd其實是fd_array這個陣列的下標,在一般情況下,程序預設開啟標準輸入,標準輸出,標準錯誤,它們的下標分別是0,1,2,之後的下標是為我們預留,供使用者使用的,如果我們不close,那麼fd_array陣列就會使用完,導致資源洩露。

總結下:從這個檔案描述符也讓我們了解了linux的重要思想,一切皆檔案,不管是普通檔案,目錄,字元裝置,塊裝置,套接字,在linux中都是以檔案被對待,它們雖然型別不同,但是對其提供的確實同一套操作模式

檔案IO 檔案描述符

a file descriptor,a small,nonnegative integer for use in subsequent system calls read 2 write 2 lseek 2 fcntl 2 etc.from man 2.6.3 當開啟或者建立乙個新的檔案時,核心向程...

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...