Linux應用基礎

1. 基礎概念

1.1 系統調用

? ? ? ? 系統調用實際上是Linux內核為上層應用程序提供的API接口,方便應用程序進行調用,類似于SVC。

1.2 庫函數

? ? ? ? 庫函數是應用層里邊的東西,在系統調用的上層,通常以動態庫文件(.so)形式提供。與系統調用區別是:庫函數是屬于應用層,而系統調用是內核提供給應用層的編程接口,屬于系統內核的一部分; 庫函數運行在用戶空間,調用系統調用會由用戶空間(用戶態)陷入到內核空間(內核態); ?庫函數通常是有緩存的,而系統調用是無緩存的,所以在性能、效率上,庫函數通常要優于系統調 用; ?可移植性:庫函數相比于系統調用具有更好的可移植性。

2. I/O基礎

? ? ? ? open/write/read/close等,主要說一下lseek。lseek函數用于設置文件讀寫偏移量,其他詳細信息看手冊。

3. Linux系統下的文件管理

3.1 靜態文件與inode

? ? ? ? 靜態文件:電腦硬盤、移動硬盤、U 盤等外部存儲設 備,文件存放在磁盤文件系統中,并且以一種固定的形式進行存放,我們把他們稱為靜態文件。

? ? ? ? inode:實際上是一個結構體,記錄了文件的不同信息;并且一個inode對應一個文件,多個inode組成一個inode表。可通過命令“ls -i”查看inode號。

3.2?磁盤分區

? ? ? ? 磁盤分為數據區和inode區,數據區用于存儲文件中的數據;inode區用于存放inode表。

? ? ? ? 快速格式化:僅刪除了u盤的inode區,但是沒有刪除數據區,因此可以找回數據。

3.3?文件狀態

? ? ? ? 文件打開過程:首先系統根據文件名找對文件對應的inode編號;然后通過該編號去inode表里邊尋找對應的inode結構體;最后根據結構體里邊記錄的信息,確定文件的數據所在的扇區,最后讀出數據。

? ? ? ? 文件打開狀態:調用open函數去打開文件的時候,內核會申請一段內存(一段緩沖區),并且將靜態文件的數 據內容從磁盤這些存儲設備中讀取到內存中進行管理、緩存(也把內存中的這份文件數據叫做動態文件、內 核緩沖區)。打開文件后,以后對這個文件的讀寫操作,都是針對內存中這一份動態文件進行相關的操作, 而并不是針對磁盤中存放的靜態文件。 當我們對動態文件進行讀寫操作后,此時內存中的動態文件和磁盤設備中的靜態文件就不同步了,數據 的同步工作由內核完成,內核會在之后將內存這份動態文件更新(同步)到磁盤設備中。

? ? ? ? 進程控制塊(PCB):是一個結構體用于記錄進程的狀態信息、運行特征等。

? ? ? ? 文件描述符表、文件表及inode之間的關系:如下圖所示:

PCB中有一個指針指向文件描述符表,該表中的每個元素對應一個文件表;文件表中存在inode指針指向inode用于讀取文件數據。

3.4?perror函數

? ? ? ? 該函數用于查看詳細的報錯信息。比如當調用open函數打開某文件時,如果失敗的話回返回-1,但是并不知道錯誤的詳細原因;因此采用這個函數即可了解,其用法如下所示:

如果失敗,會打印 “open error:加具體原因” 。

3.5?exit、_exit、_Exit函數

? ? ? ? 這三個函數都用于結束進程,類似于return;。調用_exit()函數會 清除其使用的內存空間,并銷毀其在內核中的各種數據結構,關閉進程的所有文件描述符,并結束進程、將 控制權交給操作系統。_exit()和_Exit()兩者等價。

????????exit()函數_exit()函數都是用來終止進程的,exit()是一個標準C庫函數,而_exit()和_Exit()是系統調用。 執行exit()會執行一些清理工作,最后調用_exit()函數。一般用exit()。

用法如下:

3.6?空洞文件

? ? ? ? 比如說現在一個文件a大小是4K;然后我調用了lseek函數將讀寫位置偏印到文件頭部6k個字節處寫數據,那么此時0-4k處有數據,6k處之后有數據,但是4k-6k處沒有數據。該區域就成為文件空洞區域,該文件也被稱為空洞文件。

? ? ? ? 空洞文件邏輯大小和物理大小:ls命令查看到空洞文件的大小是8K,使用ls命令查看到的大小是文件的邏輯大小,自然是包括了 空洞部分大小和真實數據部分大小;當使用du命令查看空洞文件時,其大小顯示為4K,du命令查看到的 大小是文件實際占用存儲塊的大小。

3.7?O_APPEND和O_TRUNC標志

? ? ? ? O_APPEND標志是,調用open函數打開文件, 當每次使用write()函數對文件進行寫操作時,都會自動把文件當前位置偏移量移動到文件末尾,從文件末 尾開始寫入數據,也就是意味著每次寫入數據都是從文件末尾開始。用法為fd=open("./src_file",O_APPEND);

? ? ? ? O_TRUNC標志是:如果使用了這個標志,調用open函數打開文件的時候會將文件 原本的內容全部丟棄,文件大小變為0。

3.8?多次打開同一文件

????????一個進程內多次open打開同一個文件,那么會得到多個不同的文件描述符fd,同理在關閉文件的 時候也需要調用close依次關閉各個文件描述符。

????????一個進程內多次open打開同一個文件,在內存中并不會存在多份動態文件。此處動態文件指的是調用open函數時會將磁盤上的數據讀到一個緩存區,這個區域的文件數據就叫動態文件。

????????同一個文件被多次打開,會得到多個不同的文件描述符,也就意味著會有多個不同的文件表,而文件讀 寫偏移量信息就記錄在文件表數據結構中,所以從這里可以推測不同的文件描述符所對應的讀寫偏移量是 相互獨立的,并沒有關聯在一起,并且文件表中i-node指針指向的都是同一個inode。

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

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

相關文章

【時間序列數據處理的噩夢與救贖:一次復雜數據可視化問題的深度復盤】

時間序列數據處理的噩夢與救贖:一次復雜數據可視化問題的深度復盤 創建時間: 2025/7/3 技術棧: Vue 3 TypeScript UniApp ECharts 問題級別: 🔴 系統性架構問題 🎯 引言:當簡單需求變成技術噩夢 “老哥,這個圖表時…

Redis--黑馬點評--基于stream消息隊列的秒殺優化業務詳解

基于redis的stream結構作為消息隊列,實現異步秒殺下單 需求: 創建一個Stream類型的消息隊列,名為stream.oreders 修改之前的秒殺下單Lua腳本,在認定有搶夠資格后,直接向stream.orders中添加消息,內容包括…

Zephyr RTOS 防止中斷影響數據寫入

目錄 概述 1 中斷保護核心策略 1.1 中斷鎖定/解鎖 (IRQ Locking) 1.2 自旋鎖 (Spin Locks) 2 高級保護技術 2.1 雙重緩沖技術 2.2 RCU (Read-Copy-Update) 模式 3 中斷安全數據寫入模式 3.1 FIFO隊列保護 3.2 原子操作保護 4 性能優化策略 4.1 分區數據保護 4.2 中斷…

Hinge×亞矩云手機:以“深度連接”為名,重構云端社交的“真實感”

當傳統婚戀社交應用困于“淺層匹配”“硬件性能瓶頸”與“信任成本高企”,當Z世代對“靈魂共鳴、沉浸體驗、隱私安全”的需求愈發迫切,以“設計讓你刪除的應用”為理念的Hinge,正攜手亞矩云手機開啟一場“云端深度社交革命”——用云端算力破…

OpenSSL 內存泄漏修復全景:119 個歷史 Commit 的類型分析與防御啟示

1 前言 openssl 開源庫作為 C/C 項目中常用的組件庫,截至 2025年7月4日 ,openssl 的提交記錄包含 119 個 Fix memory leak 。 本文基于源碼 Commit 分析,揭示了 OpenSSL 內存泄漏修復從被動應對到主動防御的演進趨勢,給各位 C/C…

十一、Python 3.13 的新特性和更新內容

1. 性能提升 1.1 解釋器性能優化 更快的啟動速度:Python 3.13 啟動時間比 3.12 快約 10-15%。內存使用優化:減少了內存占用,特別是在處理大型數據結構時。 1.2 字節碼優化 新的字節碼指令:引入了更高效的字節碼指令&#xff0…

后端 Maven打包 JAR 文件、前端打包dist文件、通過后端服務訪問前端頁面、Nginx安裝與部署

打包 JAR 文件通常使用 Maven 或 Gradle 構建工具(Spring Boot 項目默認推薦 Maven)。以下是詳細步驟和常見問題解答: 一、后端 Maven打包 JAR 文件 1. 確保項目是 Spring Boot 項目 項目結構應包含 pom.xml(Maven 配置文件&am…

大數據系列 | 日志數據采集工具Filebeat的架構分析及應用

大數據系列 | 日志數據采集工具Filebeat的架構分析及應用 1. Filebeat的由來2. Filebeat原理架構分析3. Filebeat的應用3.1. 安裝Filebeat3.2. 實戰采集應用程序日志1. Filebeat的由來 在介紹Filebeat之前,先介紹一下Beats。Beats是一個家族的統稱,Beats家族有8個成員,早期的…

基于 Vue + RuoYi 架構設計的商城Web/小程序實訓課程

以下是基于 Vue RuoYi 架構設計的商城Web/小程序實訓課程方案,結合企業級開發需求與教學實踐,涵蓋全棧技術棧與實戰模塊: 📚 一、課程概述 目標:通過Vue前端 RuoYi后端(Spring Boot)開發企業…

Puppeteer 相關漏洞-- Google 2025 Sourceless

題目的代碼非常簡單,核心只有這一句 page.goto(url, { timeout: 2000 });方案1 Puppeteer 是一個常用的自動化瀏覽器工具,默認支持 Chrome,但也可以配置支持 Firefox。然而,當 Puppeteer 運行在 Firefox 上時,會自動關閉一些安全特…

LucidShape 2024.09 最新

LucidShape的最新版本2024.09帶來了一系列新功能與增強功能,旨在解決光學開發者面臨的最常見和最復雜的挑戰。從微透鏡陣列(MLA)的自動掩模計算,到高級分析功能的改進,LucidShape 2024.09致力于簡化工作流程并增強設計…

mini-electron使用方法

把在官方群里“官方132版”目錄里下載的包里的minielectron_x64.exe解壓到你本地某個目錄,改名成electron.exe,比如G:\test\ele_test\mini_electron_pack\electron.exe。 修改你項目的package.json文件。一個例子是: {"name": &q…

Android 網絡全棧攻略(七)—— 從 OkHttp 攔截器來看 HTTP 協議二

Android 網絡全棧攻略系列文章: Android 網絡全棧攻略(一)—— HTTP 協議基礎 Android 網絡全棧攻略(二)—— 編碼、加密、哈希、序列化與字符集 Android 網絡全棧攻略(三)—— 登錄與授權 Andr…

45-使用scale實現圖形縮放

45-使用scale實現圖形縮放_嗶哩嗶哩_bilibili45-使用scale實現圖形縮放是一次性學會 Canvas 動畫繪圖(核心精講50個案例)2023最新教程的第46集視頻,該合集共計53集,視頻收藏或關注UP主,及時了解更多相關視頻內容。http…

軟件開發早期階段,使用存儲過程的優勢探討:敏捷開發下的利器

在現代軟件開發中,隨著持續集成與敏捷開發的深入推進,開發團隊越來越重視快速響應需求變更、快速上線迭代。在這種背景下,傳統將業務邏輯全部放在應用層的方式在某些階段顯得笨重。本文將探討在軟件開發初期,特別是在需求尚不穩定…

『 C++入門到放棄 』- string

C 學習筆記 - string 一、什麼是string ? string 是 C 中標準函數庫中的一個類,其包含在 中 該類封裝了C語言中字符串操作,提供內存管理自動化與更多的操作 支持複製、比較、插入、刪除、查找等功能 二、常用接口整理 類別常用方法 / 說明建立與指…

ARM架構下C++程序堆溢出與棧堆碰撞問題深度解析

ARM架構下C程序堆溢出與棧堆碰撞問題深度解析 一、問題背景:從崩潰現象到內存異常 在嵌入式系統開發中,程序崩潰是常見但棘手的問題。特別是在ARM架構設備上,一種典型的崩潰場景如下:程序在執行聚類算法或大規模數據處理時突然終…

.NET9 實現排序算法(MergeSortTest 和 QuickSortTest)性能測試

在 .NET 9 平臺下,我們對兩種經典的排序算法 MergeSortTest(歸并排序)和 QuickSortTest(快速排序)進行了性能基準測試(Benchmark),以評估它們在不同數據規模下的執行效率、內存分配及…

RabbitMQ - SpringAMQP及Work模型

一、概述RabbitMQ是一個流行的開源消息代理,支持多種消息傳遞協議。它通常用于實現異步通信、解耦系統組件和分布式任務處理。Spring AMQP是Spring框架下的一個子項目,提供了對RabbitMQ的便捷訪問和操作。本文將詳細介紹RabbitMQ的工作模型(W…

微信小程序51~60

1.界面交互-loading提示框 loading提示框用于增加用戶體驗, 對應的API有兩個: wx.showLoading()顯示loading提示框wx.hideLoading()關閉loading提示框 Page({getData () {//顯示loading提示框wx.showLoading({//提示內容不會自動換行,多出來的…