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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

先來看看C標準I/O庫函數是如何用系統調用實現的。?


fopen(3)?

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

  • 文件fd
  • 緩沖區指針
  • 緩沖區長度
  • 當前緩沖區讀取長度
  • 出錯標志

返回這?個FILE 結構體的地址。?



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


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


fclose(3)?
如果I/O緩沖區中還有數據沒寫回文件,就調用write(2) 寫回文件,然后調用close(2) 關閉文 件,釋放FILE 結構體和I/O緩沖區。


以寫文件為例,C標準I/O庫函數(printf(3) 、putchar(3) 、fputs(3) )與系統調用write(2) 的關 系如下圖所示。

? 庫函數與系統調用的層次關系




open 、read 、write 、close 等系統函數稱為無緩沖I/O(Unbuffered I/O)函數,因為它們位于C標 準庫的I/O緩沖區的底層。用戶程序在讀寫文件時既可以調用C標準I/O庫函數,也可以直接調用 底層的Unbuffered I/O函數,那么用哪一組函數好呢??


用Unbuffered I/O函數每次讀寫都要進內核,調一個系統調用比調一個用戶空間的函數要慢很 多,所以在用戶空間開辟I/O緩沖區還是必要的,用C標準I/O庫函數就比較方便,省去了自己 管理I/O緩沖區的麻煩。?


用c標準I/O庫函數要時刻注意I/O緩沖區和實際文件有可能不一致,在必要時需調 用fflush(3) 。?


我們知道UNIX的傳統是Everything is a file,I/O函數不僅用于讀寫常規文件,也用于讀寫設 備,比如終端或網絡設備。在讀寫設備時通常是不希望有緩沖的,例如向代表網絡設備的文 件寫數據就是希望數據通過網絡設備發送出去,而不希望只寫到緩沖區里就算完事兒了,當網絡設備接收到數據時應用程序也希望第一時間被通知到,所以網絡編程通常直接調 用Unbuffered I/O函數。?


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


參考: 《linux c 編程一站式學習》

轉載于:https://www.cnblogs.com/alantu2018/p/8472709.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。