目錄

文件描述符
系統(tǒng)調(diào)用 open
為什么fd從3開(kāi)始呢?
為什么是0,1,2,3...呢?
文件描述符分配規(guī)則?
系統(tǒng)調(diào)用 close
系統(tǒng)調(diào)用 wirte
系統(tǒng)調(diào)用 read
在了解文件描述符之前,先了解關(guān)于操作文件的系統(tǒng)調(diào)用,C語(yǔ)言中的fwrite,fread等等對(duì)文件操作的函數(shù)不是系統(tǒng)調(diào)用,而是C語(yǔ)言對(duì)系統(tǒng)調(diào)用做的封裝。
語(yǔ)言為什么對(duì)系統(tǒng)調(diào)用封裝?
1.原生的系統(tǒng)接口,使用成本較高
2.不同系統(tǒng)系統(tǒng)接口不同,直接使用接口,語(yǔ)言不具備跨平臺(tái)性
系統(tǒng)調(diào)用 open什么是跨平臺(tái)性?
C語(yǔ)言窮舉了所有OS系統(tǒng)的底層接口并進(jìn)行條件編譯去封裝不同系統(tǒng)的系統(tǒng)調(diào)用,就讓C語(yǔ)言寫(xiě)的程序在不同的OS下都能正常編譯運(yùn)行,就稱(chēng)C語(yǔ)言具有跨平臺(tái)性。

參數(shù)含義是:open(文件路徑,打開(kāi)方式,權(quán)限)?
參數(shù)flag表示打開(kāi)方式,用宏傳遞,有O_RDONLY只讀,O_WRONLY只寫(xiě),O_RDWR讀寫(xiě)三者取一,可加O_CREAT,O_TRUNC等,添加參數(shù)時(shí)用 | 的方式,因?yàn)橄到y(tǒng)調(diào)用傳遞標(biāo)記位,是位圖結(jié)構(gòu)來(lái)傳遞的,簡(jiǎn)單來(lái)說(shuō)不同的比特位具有不同的含義,或上不同的宏就是給不同位標(biāo)記。
參數(shù)mode表示權(quán)限傳遞八進(jìn)制數(shù)字,比如0666就可以了,如果要防止系統(tǒng)默認(rèn)權(quán)限掩碼影響,可以先調(diào)用umask函數(shù)修改權(quán)限。
返回值:返回文件描述符,-1返回值代表錯(cuò)誤

使用示例:

輸出:

因?yàn)?表示標(biāo)準(zhǔn)輸入,1表示標(biāo)準(zhǔn)輸出,2表示標(biāo)準(zhǔn)錯(cuò)誤,當(dāng)程序運(yùn)行的時(shí)候,這三個(gè)文件已經(jīng)被默認(rèn)打開(kāi)了,在C語(yǔ)言封裝的結(jié)構(gòu)體FILE中就有fileno成員就是表示文件描述符,比如下面代碼輸出:

內(nèi)核中用struct file結(jié)構(gòu)體描述被打開(kāi)的 文件(被打開(kāi)的文件在內(nèi)存中),進(jìn)程pcb中有struct files_struct *files指針,指向描述進(jìn)程打開(kāi)文件的結(jié)構(gòu)體,結(jié)構(gòu)體中有struct file*fd_array[]指針數(shù)組存放指針,指針指向內(nèi)核打開(kāi)的文件,內(nèi)核打開(kāi)的文件被OS用鏈表維護(hù)起來(lái)。
從內(nèi)核代碼可以看到:
PCB中的files_struct:

files_struct中的文件指針數(shù)組:

轉(zhuǎn)到file的定義看到address_space:

其內(nèi)部封裝了文件的緩沖區(qū):

上述內(nèi)容畫(huà)圖理解下:

從頭遍歷fd_array[]數(shù)組,找到一個(gè)最小的沒(méi)有被使用的下標(biāo),比如關(guān)閉1號(hào)文件,打開(kāi)新文件的文件描述符是1,往1文件中打印則會(huì)往新文件打印,先寫(xiě)到了緩沖區(qū)(語(yǔ)言級(jí)別)中 ,加\n也不刷新,因?yàn)閷?xiě)到磁盤(pán)的刷新策略是全緩沖,所以程序運(yùn)行中除非強(qiáng)制刷新否則不刷新,程序退出會(huì)刷新。
使用系統(tǒng)調(diào)用dup2也可以完成上述的重定向操作,拷貝文件描述符對(duì)應(yīng)的內(nèi)容(本質(zhì)是拷貝內(nèi)核文件結(jié)構(gòu)體指針),最終指向同一個(gè)文件?
注意:int dup2(int oldfd,int newfd) ,是將oldfd的內(nèi)容拷貝到newfd,最后只剩oldfd,往newfd輸出就會(huì)輸出到oldfd文件,這就是輸出重定向。
系統(tǒng)調(diào)用 close函數(shù)原型:int close(int fd),參數(shù)就是要關(guān)閉的文件的文件描述符
注意,這里的關(guān)閉是進(jìn)程關(guān)閉了文件,管理文件結(jié)構(gòu)體的釋放是OS的工作,文件內(nèi)核結(jié)構(gòu)中用計(jì)數(shù)器存儲(chǔ)文件被打開(kāi)的次數(shù),進(jìn)程關(guān)閉只需將指針數(shù)組對(duì)應(yīng)下標(biāo)內(nèi)容改成NULL,并將計(jì)數(shù)器--即可。
系統(tǒng)調(diào)用 wirte
從buf中寫(xiě)入fd文件中,寫(xiě)入count字節(jié),返回值類(lèi)型是ssize_t表示有符號(hào)整數(shù),寫(xiě)入失敗就返回-1,寫(xiě)入成功就返回寫(xiě)入的個(gè)數(shù)。
系統(tǒng)調(diào)用 read
返回值
>0,返回讀取個(gè)數(shù)
=0 表示讀取到了EOF
<0 讀取失敗
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
標(biāo)題名稱(chēng):Linux中的文件描述符-創(chuàng)新互聯(lián)
分享路徑:http://chinadenli.net/article0/hpsoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、ChatGPT、用戶(hù)體驗(yàn)、域名注冊(cè)、網(wǎng)站制作、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容