linux的底层文件i o,Linux 文件I/O操作
一.緩存區
根據應用程序對文件的訪問方式,即是否存在緩沖區,對文件的訪問可以分為帶緩沖區的操作和非緩沖區的文件操作:
a) 帶緩沖區文件操作:高級標準文件I/O操作,將會在用戶空間中自動為正在使用的文件開辟內存緩沖區。
b) 非緩沖區文件操作:低級文件I/O操作,讀寫文件時,不會開辟對文件操作的緩沖區,直接通過系統調用對磁盤進行操作(讀、寫等),當然用于可以在自己的程序中為每個文件設定緩沖區。
兩種文件操作的解釋和比較:
1、非緩沖的文件操作訪問方式,每次對文件進行一次讀寫操作時,都需要使用讀寫系統調用來處理此操作,即需要執行一次系統調用,執行一次系統調用將涉及到CPU狀態的切換,即從用戶空間切換到內核空間,實現進程上下文的切換,這將損耗一定的CPU時間,頻繁的磁盤訪問對程序的執行效率造成很大的影響。
2、ANSI標準C庫函數 是建立在底層的系統調用之上,即C函數庫文件訪問函數的實現中使用了低級文件I/O系統調用,ANSI標準C庫中的文件處理函數為了減少使用系統調用的次數,提高效率,采用緩沖機制,這樣,可以在磁盤文件進行操作時,可以一次從文件中讀出大量的數據到緩沖區中,以后對這部分的訪問就不需要再使用系統調用了,即需要少量的CPU狀態切換,提高了效率。
二.緩沖區類型
標準I/O提供了3種類型的緩沖區。
在文件/usr/include/stdio.h 中可以看到:
1、? 全緩沖區:這種緩沖方式要求填滿整個緩沖區后才進行I/O系統調用操作。對于磁盤文件的操作通常使用全緩沖的方式訪問。
2、? 行緩沖區:在這種情況下,當在輸入和輸出中遇到換行符時,標準I/O庫函數將會執行系統調用操作
3、? 無緩沖區是指標準I/O庫不對字符進行緩存,直接調用系統調用。標準出錯流stderr通常是不帶緩沖區的,這使得出錯信息能夠盡快地顯示出來。
二.操作函數
對于任何一個給定的文件流,可以調用setbuf()和setvbuf()函數更改其緩沖區類型。
從man 手冊可以看出,setbuf、buffer、setlinebuf、setvbuf都是操作文件流緩沖區的函數。這些操作函數在標準的I/O庫中實現。
Setbuf():用于改變文件流緩沖區位置,此函數第一個參數為要操作的流對象,第二個參數buf 必須指向一個長度BUFSIZ 的緩沖區。如果將buf 設置為NULL,則關閉緩沖區。如果執行成功,將返回0,否則返回非0 值。
Setvbuf(): 此函數第一個參數為要操作的流對象;第二個參數buf 必須指向一個長為BUFSIZ 的緩沖區;第三個參數為緩沖區類型(可選擇無緩沖區、行緩沖區、全緩沖區),第四個參數為該buf的大小。如果指定一個不帶緩沖區的流,則忽略buf和size參數。如果指定全緩沖區或行緩沖區,則buf 和size 可選擇地指定一個緩沖區及其長度。此函數如果執行成功,將返回0,否則返回非0 值。
總結
以上是生活随笔為你收集整理的linux的底层文件i o,Linux 文件I/O操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发票号是在发票的哪个位置
- 下一篇: gta5怎么抱起路人 Rockstar