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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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({//提示内容不会自动换行,多出来的…