日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C 标准IO 库函数与Unbuffered IO函数

發(fā)布時(shí)間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C 标准IO 库函数与Unbuffered IO函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先來看看C標(biāo)準(zhǔn)I/O庫函數(shù)是如何用系統(tǒng)調(diào)用實(shí)現(xiàn)的。?


fopen(3)?

調(diào)用open(2)打開指定的文件,返回一個(gè)文件描述符(就是一個(gè)int 類型的編號(hào)),分配一?個(gè)FILE 結(jié)構(gòu)體,?通常里面包含了:

  • 文件fd
  • 緩沖區(qū)指針
  • 緩沖區(qū)長(zhǎng)度
  • 當(dāng)前緩沖區(qū)讀取長(zhǎng)度
  • 出錯(cuò)標(biāo)志

返回這?個(gè)FILE 結(jié)構(gòu)體的地址。?



fgetc(3)?
通過傳入的FILE *參數(shù)找到該文件的描述符、I/O緩沖區(qū)和當(dāng)前讀寫位置,判斷能否從I/O緩沖 區(qū)中讀到下一個(gè)字符,如果能讀到就直接返回該字符,否則調(diào)用read(2),把文件描述符傳進(jìn) 去,讓內(nèi)核讀取該文件的數(shù)據(jù)到I/O緩沖區(qū),然后返回下一個(gè)字符。注意,對(duì)于C標(biāo)準(zhǔn)I/O庫來 說,打開的文件由FILE *指針標(biāo)識(shí),而對(duì)于內(nèi)核來說,打開的文件由文件描述符標(biāo)識(shí),文件描述符從open 系統(tǒng)調(diào)用獲得,在使用read 、write 、close 系統(tǒng)調(diào)用時(shí)都需要傳文件描述符。?


fputc(3)?
判斷該文件的I/O緩沖區(qū)是否有空間再存放一個(gè)字符,如果有空間則直接保存在I/O緩沖區(qū)中并 返回,如果I/O緩沖區(qū)已滿就調(diào)用write(2) ,讓內(nèi)核把I/O緩沖區(qū)的內(nèi)容寫回文件。?


fclose(3)?
如果I/O緩沖區(qū)中還有數(shù)據(jù)沒寫回文件,就調(diào)用write(2) 寫回文件,然后調(diào)用close(2) 關(guān)閉文 件,釋放FILE 結(jié)構(gòu)體和I/O緩沖區(qū)。


以寫文件為例,C標(biāo)準(zhǔn)I/O庫函數(shù)(printf(3) 、putchar(3) 、fputs(3) )與系統(tǒng)調(diào)用write(2) 的關(guān) 系如下圖所示。

? 庫函數(shù)與系統(tǒng)調(diào)用的層次關(guān)系




open 、read 、write 、close 等系統(tǒng)函數(shù)稱為無緩沖I/O(Unbuffered I/O)函數(shù),因?yàn)樗鼈兾挥贑標(biāo) 準(zhǔn)庫的I/O緩沖區(qū)的底層。用戶程序在讀寫文件時(shí)既可以調(diào)用C標(biāo)準(zhǔn)I/O庫函數(shù),也可以直接調(diào)用 底層的Unbuffered I/O函數(shù),那么用哪一組函數(shù)好呢??


用Unbuffered I/O函數(shù)每次讀寫都要進(jìn)內(nèi)核,調(diào)一個(gè)系統(tǒng)調(diào)用比調(diào)一個(gè)用戶空間的函數(shù)要慢很 多,所以在用戶空間開辟I/O緩沖區(qū)還是必要的,用C標(biāo)準(zhǔn)I/O庫函數(shù)就比較方便,省去了自己 管理I/O緩沖區(qū)的麻煩。?


用c標(biāo)準(zhǔn)I/O庫函數(shù)要時(shí)刻注意I/O緩沖區(qū)和實(shí)際文件有可能不一致,在必要時(shí)需調(diào) 用fflush(3) 。?


我們知道UNIX的傳統(tǒng)是Everything is a file,I/O函數(shù)不僅用于讀寫常規(guī)文件,也用于讀寫設(shè) 備,比如終端或網(wǎng)絡(luò)設(shè)備。在讀寫設(shè)備時(shí)通常是不希望有緩沖的,例如向代表網(wǎng)絡(luò)設(shè)備的文 件寫數(shù)據(jù)就是希望數(shù)據(jù)通過網(wǎng)絡(luò)設(shè)備發(fā)送出去,而不希望只寫到緩沖區(qū)里就算完事兒了,當(dāng)網(wǎng)絡(luò)設(shè)備接收到數(shù)據(jù)時(shí)應(yīng)用程序也希望第一時(shí)間被通知到,所以網(wǎng)絡(luò)編程通常直接調(diào) 用Unbuffered I/O函數(shù)。?


C標(biāo)準(zhǔn)庫函數(shù)是C標(biāo)準(zhǔn)的一部分,而Unbuffered I/O函數(shù)是UNIX標(biāo)準(zhǔn)的一部分,在所有支持C語言的 平臺(tái)上應(yīng)該都可以用C標(biāo)準(zhǔn)庫函數(shù)(除了有些平臺(tái)的C編譯器沒有完全符合C標(biāo)準(zhǔn)之外),而只有 在UNIX平臺(tái)上才能使用Unbuffered I/O函數(shù),所以C標(biāo)準(zhǔn)I/O庫函數(shù)在頭文件stdio.h中聲明, 而read 、write 等函數(shù)在頭文件unistd.h 中聲明。在支持C語言的非UNIX操作系統(tǒng)上,標(biāo)準(zhǔn)I/O庫的 底層可能由另外一組系統(tǒng)函數(shù)支持,例如Windows系統(tǒng)的底層是Win32 API,其中讀寫文件的系統(tǒng) 函數(shù)是ReadFile 、WriteFile 。


參考: 《linux c 編程一站式學(xué)習(xí)》

轉(zhuǎn)載于:https://www.cnblogs.com/alantu2018/p/8472709.html

總結(jié)

以上是生活随笔為你收集整理的C 标准IO 库函数与Unbuffered IO函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。