Linux 文件 I/O 與標準 I/O 緩沖機制詳解

一、什么是標準 I/O?(FILE* 接口)

標準 I/O 是 C 標準庫為我們提供的一套高級文件操作接口,核心基于結構體 FILE,常見函數如:

  • fopen() / fclose()

  • fread() / fwrite()

  • fprintf() / fscanf()

  • fflush() / fseek() / ftell()

其背后的設計理念是:在用戶空間加一層緩沖區機制,減少頻繁的系統調用,提高 I/O 效率。


二、標準流與 FILE* 指針的關系

C 語言啟動時自動打開的三個標準流:

名稱

全局變量

描述

默認綁定設備

標準輸入

stdin

鍵盤輸入

文件描述符 0

標準輸出

stdout

屏幕輸出

文件描述符 1

標準錯誤輸出

stderr

屏幕錯誤輸出

文件描述符 2

它們本質上是三個全局變量指針:

 

extern FILE *stdin; // 標準輸入

extern FILE *stdout; // 標準輸出

extern FILE *stderr; // 標準錯誤

FILE 的結構體對象,這些對象在程序啟動時已經初始化好,不需要手動打開。

三、標準 I/O 的緩沖機制分類

標準 I/O 相比 read()/write() 的一個顯著特點是:內部使用了緩沖區機制(緩解頻繁的系統調用)。

1. 無緩沖(Unbuffered)

  • 直接寫入/讀取,不做緩存。

  • 特征:每次 fputc()、fprintf(stderr, ...) 都是一次系統調用。

  • 示例:標準錯誤流 stderr 通常是無緩沖。

2. 行緩沖(Line Buffered)

  • 讀寫一整行再提交,或者滿足以下任一條件立即刷新:

  1. 遇到換行符 \n

  2. 調用 fflush()

  3. 緩沖區被填滿

  4. 程序正常退出

  • 示例:標準輸出 stdout 在連接終端時通常是行緩沖。

3. 全緩沖(Fully Buffered)

  • 只有當緩沖區滿時或顯示調用 fflush() 時才進行 I/O 操作。

  • 示例:對磁盤文件操作通常是全緩沖。

關于緩沖區的大小

標準 I/O 緩沖區大小(來自 APUE 的描述)

標準 I/O 使用的是 用戶空間的緩沖機制,而這部分緩沖區的大小通常為:

? BUFSIZ,大小通常是 8192 字節(即 8KB)

  • BUFSIZ 是一個宏,定義在 <stdio.h> 中,表示標準庫默認的緩沖區大小。

  • 實際大小由系統實現決定,但大多數現代系統中是 8192 字節(8KB)。

  • 你可以通過下面代碼查看具體大小:

 
 

#include <stdio.h> int main() { printf("BUFSIZ = %d\n", BUFSIZ); return0; }

🧠 說明一下:

  • 標準I/O函數(如 fopen/fread/fwrite)使用內部緩沖區,提高讀寫效率。

  • 這個緩沖區由 libc 實現,屬于用戶空間。

  • 不像 read() / write() 系統調用直接進入內核空間,標準IO通過一次性讀寫大塊內容來減少系統調用次數。


🧪 補充說明:你還可以自己設定緩沖區

 
 

FILE *fp = fopen("file.txt", "r"); char buf[BUFSIZ]; setbuf(fp, buf); // 手動設置緩沖區

或者使用 setvbuf() 函數精細控制緩沖類型(全緩沖、行緩沖、無緩沖)和大小。

📝 總結

名稱

值(常見)

定義位置

用途

BUFSIZ

8192 字節

<stdio.h>

標準I/O默認緩沖區大小

📌 注意:BUFSIZ 是用于標準IO緩沖(如 fopen),而不是 read() 等系統調用(后者不涉及標準IO緩沖機制)。

這里FILE結構體需要描述

FILE 結構體的典型定義(簡化版)

FILE 的真實定義是不公開的(屬于 libc 實現細節),但你可以在 GNU libc 或 musl 的源碼中看到類似的簡化結構:

 
 

typedef struct _IO_FILE { int _fileno; // 文件描述符,對應 open 返回的 int char *_buffer; // 指向緩沖區的指針 char *_bufpos; // 當前緩沖位置 char *_bufend; // 緩沖區末尾 int _flags; // 文件狀態,如可讀、可寫、錯誤、EOF 等 long _pos; // 當前文件位置(用于 ftell、fseek) // 還有更多復雜字段... } FILE;

📌注意:不同系統實現(如 glibc、musl)中,這個結構體的字段名稱和結構會有所不同。

🎯 FILE 和底層文件描述符的區別

項目

FILE(高級IO)

文件描述符(低級IO)

類型

FILE *(結構體指針)

int(整數)

接口

fopen, fread, fwrite 等

open, read, write 等

是否緩沖

? 有緩沖區(提高效率)

? 無緩沖(每次都直接系統調用)

是否格式化支持

? fprintf, fscanf

? 不支持格式化


🧠 標準流的 FILE 示例

C語言一開始默認打開了三個標準流(在 <stdio.h> 中定義):

extern FILE *stdin; // 標準輸入 extern FILE *stdout; // 標準輸出 extern FILE *stderr; // 標準錯誤

你可以直接使用這些來讀寫數據:

fprintf(stdout, "Hello\n"); fscanf(stdin, "%d", &num);


🧪 進階:緩沖機制與 FILE

  • FILE 內部包含了一個緩沖區,默認大小是 BUFSIZ(通常是 8192 字節)。

  • 分為:

  • 全緩沖(默認情況,大文件使用)

  • 行緩沖(用于終端)

  • 無緩沖(stderr)

你可以用 setvbuf() 或 setbuf() 控制緩沖方式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84831.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++的前世今生-C++11

C98&#xff08;ISO/IEC 14882:1998&#xff09; C98 是 C 的第一個標準化版本&#xff08;ISO/IEC 14882:1998&#xff09;&#xff0c;它正式確立了 C 的核心語言特性和標準庫。以下是 C98 的主要特性總結&#xff1a; 一、核心語言特性** 模板&#xff08;Templates&…

詞編碼模型怎么進行訓練的,輸出輸入是什么,標簽是什么

詞編碼模型怎么進行訓練的,輸出輸入是什么,標簽是什么 詞編碼模型的訓練本質是通過數據驅動的方式,將離散的文本符號映射為連續的語義向量。 一、訓練機制:從符號到向量的映射邏輯 1. 核心目標 將單詞/子詞(Token)映射為低維向量,使語義相關的詞在向量空間中距離更近…

【Linux指南】文件管理高級操作(復制、移動、查找)

引言 在Linux系統管理中&#xff0c;文件的復制、移動與查找是比基礎操作更進階的核心技能&#xff0c;它們構成了高效管理文件系統的"三駕馬車"。當我們需要備份重要數據、重構目錄結構或在龐大的文件系統中定位目標文件時&#xff0c;cp、mv、find等命令將成為最得…

【棧】-----【小C的記事本】

小C的記事本 題目描述 小C最近學會了 Java 小程序的開發&#xff0c;他很開心&#xff0c;于是想做一個簡單的記事本程序練練手。 他希望他的記事本包含以下功能&#xff1a; append(str)&#xff1a;向記事本插入字符串 str&#xff08;英文字符&#xff09;。delete(k)&am…

技能系統詳解(2)——特效表現

特效會有個EffectManager用于統一管理所有特效&#xff0c;技能特效只是各類特效中的一種 EffectManager需要提供特效的創建&#xff0c;返回被封裝為EffectHandle 每類特效都有各種不同的配置參數&#xff0c;這些配置參數會傳遞給EffectManager用于生成EffectHandler 為支…

12.OpenCV—基礎入門

01讀取圖像 02創建空白圖像 03保存圖像 04更改圖像亮度 05更改圖像對比度 06灰度直方圖均衡 07彩色直方圖均衡 08五種濾波方式 09形態學操作 10仿射變換 11角度縮放仿射變換 12透視變換 13坐標映射 14模板匹配 15多模板匹配 16查找輪廓線 17輪廓線匹配 17繪制…

【Python】Python之什么是生成器?什么是迭代器?

目錄 專欄導讀前言什么是迭代器&#xff08;Iterator&#xff09;&#xff1f;迭代器的定義迭代器協議可迭代對象 vs 迭代器自定義迭代器迭代器的優勢 什么是生成器&#xff08;Generator&#xff09;&#xff1f;生成器的定義生成器函數生成器表達式復雜的生成器示例生成器的狀…

Python中實現簡單爬蟲并處理數據

在當今數據驅動的時代&#xff0c;能夠從互聯網上高效地抓取信息變得越來越重要。Python因其簡潔易學的特性&#xff0c;成為了編寫網絡爬蟲的首選語言之一。接下來&#xff0c;我將介紹如何使用Python來實現一個基礎的網絡爬蟲&#xff0c;并對收集到的數據進行初步處理。 首先…

免費wordpress主題網

免費WordPress主題網 WP模板牛 WP模板牛是一個提供免費WordPress主題的網站&#xff0c;用戶可以在這里找到大量高質量的模板&#xff0c;適用于各種網站類型。該網站致力于為用戶提供簡單、高效的建站體驗。 官網鏈接&#xff1a; https://wpniu.com 建站哥模板 建站哥模板…

為什么需要MyBatis-Plus條件構造器?

目錄 前言 一、傳統SQL編寫的痛點 二、條件構造器的核心優勢 1. 防SQL注入&#xff08;安全性&#xff09; 2. 面向對象編程&#xff08;可讀性&#xff09; 3. 動態條件構建&#xff08;靈活性&#xff09; 4. 數據庫無關性&#xff08;可移植性&#xff09; 三、典型應…

【從零學習JVM|第九篇】常見的垃圾回收算法和垃圾回收器

前言&#xff1a; 我們知道在堆內存中&#xff0c;會有自動的垃圾回收功能&#xff0c;那今天這篇文章將會向你介紹&#xff0c;這個功能實現的方式&#xff0c;還有實現的對象&#xff0c;接下來就由我來給你們詳細介紹垃圾回收的算法和實現算法的回收器。 目錄 前言&#…

品牌竄貨治理解決方案

在渠道網絡的暗潮中&#xff0c;竄貨猶如隱秘的漩渦&#xff0c;某知名白酒品牌曾因區域竄貨導致終端價格體系崩潰&#xff0c;半年內損失超3億元。竄貨行為不僅破壞市場秩序&#xff0c;更會引發信任危機。隨著電商平臺的多元化與分銷層級的復雜化&#xff0c;品牌方亟需構建一…

車載電子電器架構 --- 法律和標準對電子電氣架構的影響

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

一種通用跨平臺實現SEH的解決方案

一. 前言 眾所周知&#xff0c;在軟件的代碼中&#xff0c;處理軟件本身的邏輯只要大約1/3的代碼&#xff0c;另外2/3的代碼實際上是在處理各種各樣的異常情況。 這些異常情況一方面是因為不同用戶之間不同的硬件軟件環境要處理。另一方面是程序中可能出現的bug。比較典型的情…

25.6.19學習總結

什么是堆&#xff08;Heap&#xff09;&#xff1f; 堆是一種特殊的樹形數據結構&#xff0c;它滿足以下兩個主要屬性&#xff1a; 結構性&#xff08;完全二叉樹&#xff09;&#xff1a; 堆總是一個完全二叉樹 (Complete Binary Tree)。這意味著&#xff0c;除了最后一層&am…

【前后前】導入Excel文件閉環模型:Vue3前端上傳Excel文件,【Java后端接收、解析、返回數據】,Vue3前端接收展示數據

【前后前】導入Excel文件閉環模型&#xff1a;Vue3前端上傳Excel文件&#xff0c;【Java后端接收、解析、返回數據】&#xff0c;Vue3前端接收展示數據 一、Vue3前端上傳&#xff08;導入&#xff09;Excel文件 ReagentInDialog.vue <script setup lang"ts" na…

網絡基礎入門:從OSI模型到TCP/IP協議詳解

網絡基礎入門&#xff1a;從OSI模型到TCP/IP協議詳解 一、網絡基礎概念與OSI七層模型 1.1 網絡通信的本質 計算機網絡的核心是將抽象語言轉換為二進制數據進行傳輸與計算&#xff0c;這一過程涉及多層抽象與轉換&#xff1a; 應用層&#xff1a;人機交互—抽象語言------編…

Linux致命漏洞CVE-2025-6018和CVE-2025-6019

Qualys 最近披露了兩個影響主流 Linux 發行版的本地權限提升 (LPE) 漏洞&#xff0c;分別是 CVE-2025-6018 和 CVE-2025-6019。這兩個漏洞可以被串聯利用&#xff0c;使得非特權用戶在幾秒鐘內獲得系統的 root 權限&#xff0c;從而實現對系統的完全控制。 一、漏洞詳情 這兩…

【Docker基礎】Docker鏡像管理:docker push詳解

目錄 引言 1 Docker鏡像推送基礎概念 1.1 什么是Docker鏡像推送 1.2 鏡像倉庫概述 1.3 鏡像標簽與版本控制 2 docker push命令詳解 2.1 基本語法 2.2 常用參數選項 2.3 實際命令示例 2.4 推送流程 2.5 步驟描述 3 鏡像推送實踐示例 3.1 登錄管理 3.2 標簽管理 3…

FPGA基礎 -- Verilog行為建模之循環語句

行為級建模&#xff08;Behavioral Modeling&#xff09;是 Verilog HDL 中最接近軟件編程語言的一種描述方式&#xff0c;適用于功能建模和仿真建模的初期階段。在行為級中&#xff0c;循環語句&#xff08;loop statements&#xff09;是常見且重要的控制結構&#xff0c;用于…