《嵌入式Linux應用編程(三):Linux文件IO系統調用深度解析》

今日學習內容

1. 文件IO與標準IO核心對比

特性標準IO文件IO
實現層C標準庫Linux內核系統調用
緩沖機制全緩沖/行緩沖無緩沖(實時讀寫)
操作對象FILE*流指針整型文件描述符(fd)
移植性跨平臺兼容Linux特有
典型應用場景普通文件操作硬件設備/特殊文件操作
性能特點減少系統調用(批量操作高效)實時響應(適合高頻小數據)

2. 文件描述符(File Descriptor)

(1) 內核級文件訪問句柄

  • 本質:整數標識符(索引內核文件表)
  • 預定義fd
    fd符號設備
    0STDIN標準輸入
    1STDOUT標準輸出
    2STDERR標準錯誤

(2) 生命周期管理

int fd = open("file.txt", O_RDWR);  // 獲取fd  
read(fd, buf, size);                // 使用fd操作  
close(fd);                         // 釋放fd(必須!)  

3. 文件權限控制:umask機制

(1) 權限計算規則

權限計算遵循公式:mode & ~umask

  • 查看umask:終端輸入umask

4. 核心系統調用詳解

(1) 文件打開:open

#include <fcntl.h>  
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *pathname, int flags, mode_t mode);  

參數說明
pathname文件路徑
flags打開標志
mode創建文件時的權限(僅O_CREAT時有效)

常用flags組合

場景flags組合
只讀打開O_RDONLY
只寫打開O_WRONLY
讀寫打開O_RDWR
創建文件O_CREAT
追加寫入O_APPEND
清空文件O_TRUNC

(2) 數據讀取:read

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);  

  • 返回值
    • 成功:實際讀取字節數
    • 文件末尾:0
    • 錯誤:-1

(3) 數據寫入:write

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);  

  • 返回值:實際寫入字節數(可能小于請求值)

(4) 文件定位:lseek

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);  

whence定位基準
SEEK_SET文件開頭
SEEK_CUR當前位置
SEEK_END文件末尾

典型應用

lseek(fd, 0, SEEK_END);  // 定位到文件末尾  

(5) 文件關閉:close

 #include <unistd.h>int close(int fd);  // 成功返回0,失敗返回-1  

打開的文件描述符必須顯式關閉!

5. 代碼

open.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open("./2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);if(-1 == fd){printf("error\n");return -1;}printf("fd = %d\n", fd);close(fd);return 0;
}

????write.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open("./2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);if(-1 == fd){printf("error\n");return -1;}char *buf = "hello";write(1, buf, sizeof(buf));close(fd);return 0;
}

read.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open("./2.txt", O_RDONLY);if(-1 == fd){printf("error\n");return -1;}char buff[1024] = {0};ssize_t cnt = read(fd, buff, sizeof(buff));// printf("cnt = %ld\n", cnt);printf("buff = %s\n", buff);close(fd);return 0;
}

cats

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open(argv[1], O_RDONLY);if(-1 == fd){printf("error\n");return -1;}char buff[1024] = {0};while(1){ssize_t cnt = read(fd, buff, sizeof(buff));write(1, buff, cnt);if(0 == cnt){break;}}close(fd);return 0;
}

copy.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open(argv[1], O_RDONLY);if(-1 == fd){printf("error\n");return -1;}char buff[1024] = {0};while(1){ssize_t cnt = read(fd, buff, sizeof(buff));write(1, buff, cnt);if(0 == cnt){break;}}close(fd);return 0;
}

lseek.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{int fd = open("./1.txt", O_RDONLY);if(fd < 0){printf("error\n");return -1;}off_t len = lseek(fd, 0, SEEK_END);printf("%ld\n", len);lseek(fd, 0, SEEK_SET);close(fd);return 0;
}

rizhi.c

#include <stdio.h>
#include <time.h>
#include <unistd.h>
FILE *fp = NULL;
int init_log()
{fp = fopen("./log.txt", "a");if(NULL == fp){printf("open error\n");return -1;}  return 0;
}int write_log(int level)
{time_t now = time(NULL);struct tm *pt = localtime(&now);const char *plevel = {0};switch (level) {case 2:  plevel = "ERROR";   break;case 1:  plevel = "WARNING"; break;case 0:  plevel = "INFO";    break;}fprintf(fp, "[%d-%d-%d %d:%d:%d] [%d]:%s\n", pt->tm_year+1900, pt->tm_mon+1,pt->tm_mday,pt->tm_hour, pt->tm_min, pt->tm_sec, level, plevel);return 0;
}void unint_log()
{fclose(fp);
}int main(void)
{init_log();int i;for(i = 0; i < 100; ++i){write_log(2);  write_log(0);write_log(1); }unint_log();return 0;
}


總結

  1. 文件IO核心價值
    • 直接內核交互 → 實時性保障
    • 設備文件操作唯一途徑
  2. 系統調用
    操作關鍵注意
    open正確處理O_CREAT的mode參數
    read/write循環處理部分寫入/讀取
    lseek支持負偏移(向前回溯)
    close配對調用防止fd泄漏
  3. 嵌入式場景適配
    • 設備驅動開發必用文件IO
    • 日志系統優先選無緩沖寫入(防斷電丟失)
    • 敏感文件設置嚴格權限(open(..., 0600)

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

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

相關文章

數據結構之順序表相關算法題

目錄一、移除元素二、刪除有序數組中的重復項三、合并兩個有序數組總結一、移除元素 移除元素 - 力扣 思路一&#xff1a;就是創建一個臨時數組&#xff0c;對原數組進行遍歷&#xff0c;找出與val不同的數據放到新數組里&#xff0c;然后再將tmp中的數據導回原數組 這個思…

百勝軟件×華為云聯合賦能,“超級國民品牌”海瀾之家新零售加速前行

報道顯示&#xff0c;早在2012年海瀾之家就開始布局數字化征程&#xff0c;并于近年對公司全流程信息化進行綜合重構升級優化&#xff0c;在采銷協同、業財一體等方面突破原有架構&#xff0c;通過信息化架構的增強為業務發展提供支撐。作為新零售重要組成部分的海瀾電商信息化…

“Zen 5”: The AMD High-Performance 4nm x86-64 Microprocessor Core

Codenamed “Zen 5,” AMD’s next-generation, energy-efficient high-performance x86 core targets a wide array of client, server, and embedded markets. Fabricated in TSMC’s 4nm FinFET process, the 55mm2 core complex (CCX), shown in Fig. 2.1.1., contains 8.6…

Linux數據庫:【表的約束】【表的基本查詢】

目錄 一.表的約束 1.1空屬性 not null 1.2默認值 default ?空屬性和默認值一起使用&#xff1f; 1.3列描述 comment 1.4 zerofill 1.5 主鍵 1.6 自增長 1.7 唯一鍵 1.8 外鍵 二. 表的基本查詢 2.1 Create 2.1.1單行數據 全列插入 2.1.2多行數據 指定列插入 2…

AJAX RSS Reader

AJAX RSS Reader 引言 隨著互聯網的快速發展,信息量的爆炸式增長,用戶對信息獲取的便捷性和實時性提出了更高的要求。RSS(Really Simple Syndication)作為一種信息聚合技術,已經廣泛應用于新聞、博客、論壇等網絡平臺。AJAX(Asynchronous JavaScript and XML)技術則提…

從實驗室到落地:飛算JavaAI水位監測系統的工程化實踐

一、飛算JavaAI平臺簡介飛算JavaAI是國內領先的軟件開發智能平臺&#xff0c;通過AI技術賦能軟件開發全流程&#xff0c;幫助開發者實現"一人一項目&#xff0c;十人抵百人"的高效開發模式。平臺核心優勢包括&#xff1a; 智能代碼生成&#xff1a;基于自然語言描述自…

前端Vite介紹(現代化前端構建工具,由尤雨溪開發,旨在顯著提升開發體驗和構建效率)ES模塊(ESM)、與傳統Webpack對比、Rollup打包

文章目錄**1. 核心特性**- **極速啟動**&#xff1a;- **按需編譯與熱模塊替換&#xff08;HMR&#xff09;**&#xff1a;- **開箱即用**&#xff1a;- **生產環境優化**&#xff1a;- **插件系統**&#xff1a;**2. 工作原理****開發模式**- **基于 ESM 的按需加載**&#xf…

python sqlite3模塊

十分想念順店雜可。。。Python 的sqlite3模塊是標準庫中用于操作SQLite 數據庫的工具。SQLite 是一款輕量級嵌入式數據庫&#xff08;無需獨立服務器&#xff0c;數據存儲在單一文件中&#xff09;&#xff0c;適合小型應用、本地數據存儲或原型開發。sqlite3模塊提供了完整的 …

用 Python 繪制企業年度財務可視化報告 —— 從 Excel 到 9 種圖表全覆蓋

用 Python 繪制企業年度財務可視化報告 —— 從 Excel 到 9 種圖表全覆蓋在企業經營分析中&#xff0c;光看一堆財務數字很難直觀發現規律和問題。 如果能將這些數據轉化為可視化圖表&#xff0c;不僅更美觀&#xff0c;還能幫助管理層快速做出決策。今天&#xff0c;我就用 Py…

一次 Unity ? Android 基于 RSA?OAEP 的互通踩坑記

這篇分享&#xff0c;記錄我如何從“Base64 報錯/平臺不支持/解密失敗”一路定位到“填充算法不一致”的根因&#xff0c;并給出兩條穩定落地方案。同時整理了調試手冊、代碼片段和上線前自檢清單&#xff0c;方便你復用。 背景 Unity 端用公鑰加密一段緊湊 JSON&#xff08;i…

Go語言GC機制:高效并發回收解析

Go 語言的垃圾回收&#xff08;Garbage Collection&#xff0c;簡稱 GC&#xff09;是其自動內存管理的核心機制&#xff0c;旨在自動識別并回收不再被使用的內存&#xff0c;避免內存泄漏&#xff0c;減輕開發者的手動內存管理負擔。Go 的 GC 算法經歷了多次迭代優化&#xff…

imx6ull-驅動開發篇23——Linux 內核定時器實驗

目錄 實驗程序編寫 修改設備樹文件 定時器驅動程序 timer.c 測試 timerApp.c Makefile 文件 運行測試 實驗程序編寫 本講實驗&#xff0c;我們使用正點原子I.MX6U-ALPHA 開發板&#xff0c;通過linux內核定時器周期性的點亮和熄滅開發板上的 LED 燈&#xff0c; LED 燈…

IPTV系統:開啟視聽與管理的全新篇章

在當今數字化飛速發展的時代&#xff0c;IPTV系統正以前所未有的姿態&#xff0c;重塑著我們的視聽體驗與管理模式。它不僅僅是一套技術系統&#xff0c;更是連接信息、溝通情感、提升效率的橋梁&#xff0c;為各個領域帶來了全新的變革與發展機遇。從電視直播的角度來看&#…

PyTorch筆記9----------Cifar10圖像分類

1.圖像分類網絡模型框架解讀 分類網絡的基本結構 數據加載模塊&#xff1a;對訓練數據加載數據重組&#xff1a;組合成網絡需要的形式&#xff0c;例如預處理、增強、各種網絡處理、loss函數計算優化器 數據加載模塊 使用公開數據集&#xff1a;torchvision.datasets使用自定義…

飛凌OK3568開發板QT應用程序編譯流程

飛凌OK3568開發板QT應用程序編譯流程開發環境&#xff1a;ubuntu20.04&#xff08;主機&#xff09;、飛凌OK3568開發板一般在linux系統下開發用于ARM開發板的QT應用程序時&#xff0c;直接在主機上開發然后進行交叉編譯即可&#xff0c;但有時候ARM開發板的廠家提供的SDK中可能…

飛算JavaAI合并項目實戰:7天完成3年遺留系統重構

引言 企業數字化進程中&#xff0c;遺留系統改造始終是CIO面臨的頭號難題。某電商平臺的實踐數據顯示&#xff1a;3年以上的Java項目平均存在47%的冗余代碼&#xff0c;63%的架構設計不符合當前業務需求&#xff0c;進行系統性重構需要投入相當于原開發量200%的資源。傳統&quo…

衛星速度增量和比沖及推力之間的關系

一、定義1.1.比沖&#xff08;Isp&#xff09;&#xff1a;比沖是衡量發動機性能的重要指標&#xff0c;反映了單位重量推進劑在發動機中產生的沖量&#xff0c;單位為米/秒&#xff08;m/s&#xff09;&#xff0c;代表燃料燃燒時噴流速度。這個單位與速度單位“米/秒”相同&a…

MATLAB繪制各種心形曲線

1.方程(1)心形線的經典隱函數方程為&#xff1a;(2)參數方程&#xff08;更平滑的心形&#xff09;&#xff1a;(3)極坐標心形線(4)參數方程&#xff08;3D心形&#xff09;(5)隱函數3D心形2. MATLAB代碼clc;close all;clear all;warning off;%清除變量 rand(seed, 100); randn…

Django REST Framework視圖

Django REST Framework (DRF) 視圖類詳解DRF 提供了豐富的視圖類來構建 API&#xff0c;從基礎到高級&#xff0c;滿足不同復雜度的需求。以下是 DRF 的主要視圖類及其使用場景&#xff1a;1. 基礎視圖類APIView所有 DRF 視圖的基類&#xff0c;相當于 Django 的 View 類的增強…

Linux面試題及詳細答案 120道(1-15)-- 基礎概念

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…