Linux 之 Linux应用编程概念、文件IO、标准IO
Linux应用编程概念、文件IO、标准IO
学习任务:
1、 学习Linux 应用开发概念,什么是系统调用,什么是库函数
2、 学习文件IO:包括 read、write、open、close、lseek
3、 深入文件IO:错误处理、exit 等
4、 学习标准IO:FILE 指针、标准输入、标准输出、标准错误、fopen()、格式化 I/O
5、 使用的工具:ubuntu虚拟机、开发板
了解Linux应用编程概念
学习文件IO函数等基础知识
学习标准IO函数等基础知识
///
补充:静态库 /动态库
程序中调用的库有两种 静态库和动态库,不管是哪种库文件本质是还是源文件,只不过是二进制格式只有计算机能够识别
项目中使用库一般有两个目的,一个是为了使程序更加简洁不需要在项目中维护太多的源文件,另一方面是为了源代码保密
拿到了库文件(动态库、静态库)之后要想使用还必须有这些库中提供的API函数的声明,也就是头文件,把这些都添加到项目中
ar rcs 静态库的名字(libxxx.a) 原文件(.o)
gcc -shared 与位置无关的目标文件(.o) -o 动态库(libxxx.so)
实战再加强
1.1 Linux 应用开发概念
在 Linux 应用开发中,主要是创建各种应用程序来满足不同的需求,如网络应用、文件处理应用等。开发人员利用 Linux 系统提供的各种资源和接口来构建这些应用程序。
1.2 系统调用(System Call)
定义:系统调用是操作系统提供给用户程序(应用程序)的一组接口,它允许应用程序请求操作系统内核的服务。这些服务包括对硬件设备的访问、文件系统操作、进程管理等。
例如,当应用程序想要读取一个文件时,它不能直接访问磁盘硬件,而是通过系统调用(如read系统调用)向内核发出请求,内核再执行相应的硬件操作并将数据返回给应用程序。
特点: 运行于内核态,系统调用会导致用户程序从用户态切换到内核态。在用户态下,应用程序只能访问自己的内存空间等受限资源;而内核态下可以访问系统的所有资源,如硬件设备、内核数据结构等。
安全性:通过系统调用接口,操作系统可以对应用程序的操作进行安全检查和权限验证。例如,一个没有足够权限的应用程序不能直接访问某些受保护的文件或硬件设备。
提供基本功能:系统调用提供了最基本的操作系统功能,如创建进程(fork系统调用)、进程间通信(如pipe系统调用)、网络通信(如socket系统调用)等。
举例:在 C 语言中,open系统调用用于打开一个文件。其基本语法为int open(const char *pathname, int flags);
这里pathname
是要打开的文件路径,flags
指定打开文件的方式(如只读、只写、读写等)。当应用程序调用open
时,实际上是向内核发送一个请求,内核根据请求在文件系统中查找文件,并根据权限等因素决定是否打开文件,然后返回一个文件描述符给应用程序。
1.3 库函数(Library Function)
定义:库函数是建立在系统调用之上的函数库,它对系统调用进行了封装和扩展。这些函数库提供了更方便、更高级的编程接口,使得应用程序开发更加容易。
例如,C 标准库中的stdio.h库中的fopen函数,它在内部可能会调用系统调用open来实现文件的打开操作,但fopen提供了更易用的接口,如可以直接使用字符串形式的文件名(不需要像open那样进行一些底层的参数设置),并且可以自动处理一些错误情况。
可移植性:很多库函数是跨平台的,例如 C 标准库函数。这使得应用程序可以在不同的操作系统(只要支持该库)上进行编译和运行,而不需要针对每个操作系统的系统调用进行重写。
功能丰富:库函数提供了比系统调用更丰富的功能。除了基本的文件操作、内存管理等功能外,还可能包括数学计算(如sin、cos等函数)、字符串处理(如strcpy、strcat等函数)等各种功能
用户态执行:库函数主要在用户态执行,不需要频繁地进行用户态到内核态的切换(除非在库函数内部调用了系统调用),因此在一定程度上提高了执行效率。
举例
在 C++ 中,iostream库中的cout对象用于输出信息到标准输出设备(通常是控制台)。它是一个库函数,在内部会处理很多复杂的操作,如缓冲区管理、格式化输出等,这些操作可能会基于底层的系统调用(如写入到标准输出文件描述符的系统调用),但从应用程序开发者的角度来看,使用cout比直接使用系统调用更加方便、直观。
2.1 文件IO
标准IO的相关函数:fopen/fread/fwrite/fseek/fflush/fclose。
系统调用IO的相关函数:open/read/write/lseek/fsync/close。
二者区别:①系统调用IO函数每次操作都会进入内核。②标准IO函数引入了用户Buffer,先访问一次内核将数据存入Buffer,然后进行读写操作,不会频繁访问内核。但其底层仍然使用系统调用IO函数。
标准IO的内部,会分配一个用户空间的buffer,读写操作先经过这个buffer。在有必要时,才会调用底下的系统调用IO向内核发起操作。 所以:标准IO效率更高;但是要访问驱动程序时就不能使用标准IO,而是使用系统调用IO。
///
3.1 I/O中的错误处理
errno 变量:
在 Linux 的文件 I/O 操作中,errno是一个非常关键的全局变量。它被定义在<errno.h>头文件中。当系统调用(如文件 I/O 相关的open、read、write、close、lseek等)发生错误时,操作系统内核会将一个表示特定错误的整数值赋给errno。
不同的错误码对应不同的情况。例如:
EACCES(13):表示权限不足。这可能发生在试图以没有足够权限的方式打开文件时,比如以写的方式打开一个只读文件,或者用户没有执行某些操作(如访问特定目录)的权限。
ENOENT(2):表示文件或目录不存在。当调用open函数试图打开一个不存在的文件,并且没有使用O_CREAT标志时,就可能得到这个错误码。
EINVAL(22):表示无效的参数。例如,如果在open函数中传递了一个无效的标志组合,就可能导致这个错误码被设置。
在程序中使用errno时,需要注意的是,它的值只有在函数调用返回错误(通常是返回 - 1)时才有意义。而且,由于errno是全局变量,在多线程环境下可能会存在竞争条件,需要谨慎处理。
perror 函数:
perror函数的主要作用是将错误信息输出到标准错误输出(stderr)。它会首先输出传入的字符串参数,然后输出一个冒号和一个空格,接着输出与errno对应的错误信息。
例如,如果有以下代码片段:
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>int main() {int fd = open("nonexistent_file", O_RDONLY);if (fd == -1) {perror("open");}return 0;
}
当open函数调用失败(因为文件不存在)时,perror函数会输出类似 “open: No such file or directory” 的内容。这里 “open” 是传入perror的字符串,后面是对应errno(ENOENT)的错误信息。
在文件 I/O 中的应用场景:在每个文件 I/O 操作之后,都应该检查返回值是否为 - 1,如果是,则调用perror函数来输出错误信息。这有助于在程序开发和调试过程中快速定位问题。例如,在write操作中,如果返回 - 1,可以使用perror来确定是磁盘空间不足(ENOSPC)还是其他权限或设备相关的问题。
exit 函数在文件 I/O 中的应用
功能:exit函数用于立即终止当前进程的执行。它会执行一些清理操作,如刷新标准 I/O 缓冲区,然后将控制权返回给操作系统。
当在文件 I/O 操作中发生严重错误,导致程序无法继续正常运行时,使用exit函数是一种合适的方式来停止程序。例如,如果一个程序依赖于某个配置文件的正确读取,而在打开或读取这个配置文件时发生了不可恢复的错误,继续执行程序可能没有意义,此时可以调用exit。
///
嵌入式Linux应用开发基础知识
Linux打工仔
相关文章:

Linux 之 Linux应用编程概念、文件IO、标准IO
Linux应用编程概念、文件IO、标准IO 学习任务: 1、 学习Linux 应用开发概念,什么是系统调用,什么是库函数 2、 学习文件IO:包括 read、write、open、close、lseek 3、 深入文件IO:错误处理、exit 等 4、 学习标准IO&a…...

PDF处理技巧:Windows电脑如何选择合适的 PDF 编辑器
您可以阅读本文以了解用于在 PC 上编辑 PDF 的顶级免费软件,而无需花费任何费用即可轻松进行快速编辑、拆分、合并、注释、转换和共享您的 PDF。 PDF 或可移植文档文件是由 Adobe 创建的一种多功能文件格式。它可以帮助您轻松可靠地交换文档,无论相关方…...

【c++】初步了解类和对象2
1、类的作用域 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。 如图,此时在类内声明了函数firstUniqChar(),在类外进行了函数体的具体定义。 但是却…...

Python库pandas之四
Python库pandas之四 输入/输出read_json函数应用实列 输入/输出 read_json 函数 词法:pandas.read_json(path_or_buf, *, orientNone, typ‘frame’, dtypeNone, convert_axesNone, convert_datesTrue, keep_default_datesTrue, precise_floatFalse, date_unitNo…...

网络攻防技术--第三次作业
文章目录 第三次作业一、通过搜索引擎搜索自己在因特网上的足迹,并确认是否存在隐私和敏感信息泄露问题。如果有信息泄露,提出解决方法。二、结合实例总结web搜索和挖掘的方法。三、网络扫描有哪几种类型?分别有什么作用?利用一种…...

带隙基准Bandgap电路学习(一)
一、原理图 Bandgap中的运放(折叠式Cascode)采用P输入对,是因为运放输入端接的PNP三极管发射极端的电位,电压小,为了确保输入对管能够饱和工作,故采用P输入对管。此外,P管作为输入管,…...

[前端][easyui]easyui select 默认值
function initRegion(key, val) {$(#Region).combobox({url: path /getTypeVaule.do?itemregion&key key "&value" val,editable: false, //不可编辑状态cache: false,valueField: TEMID,textField: TEMID,loadFilter: function (data) {data.unshift({…...

项目开发--大模型--个人问答知识库--chain控制
背景 1、langchain当中的chain prompt | llm | output_parser这个链能更长吗? 在 LangChain 中,链(chain)可以根据需要变得非常长,并且可以包含多种不同类型的组件。链的目的是将多个步骤串联起来,以便以…...

STM32—SPI通讯协议
前言 由于I2C开漏外加上拉电阻的电路结构,使得通信线高电平的驱动能力比较弱,这就会号致,通信线由候电平变到高电平的时候,这个上升沿耗时比较长,这会限制I2C的最大通信速度, 所以,I2C的标准模…...

Android 安装过程五 MSG_INSTALL消息的处理 安装
现在马上进入正式的安装流程。 从前面文章 Android 安装过程四 MSG_INSTALL消息的处理 安装之前的验证知道,在验证之后没有什么问题的情况下,会回调onVerificationComplete()方法,它位于PackageInstallerSession类中。 private void onVe…...

大数据开发--1.3 Linux的常用命令大全
目录 一. 终端命令格式 命令格式 说明: 二. 显示文件列表命令 -ls 作用 格式 ls常用选项 案例 三. 目录操作命令 -pwd 作用 格式 案例 四. 目录操作命令 -cd 作用 格式 案例 五. 目录操作命令 -mkdir 作用 格式 案…...

使用PuTTY连接到Amazon Linux实例
PuTTY 是一款免费的 SSH 客户端,广泛用于从 Windows 系统连接到 Linux 实例。如果你使用的是 Windows Server 2019 或更高版本,可以考虑使用内置的 OpenSSH 工具,但 PuTTY 依然是一个非常受欢迎的选择。 一、先决条件 在使用 PuTTY 连接到 …...

Nexus搭建maven私有仓库
内网访问,内网团队使用一个服务缓存节省外网宽带。 微服务开发中加速 Maven 项目构建,加快团队合作,提高工作效率 允许上传和下载私有库,并且不被外部访问,安全 稳定。 方便内部项目服务的依赖引用,而不需要…...

留存率的定义与SQL实现
1.什么是留存率 留存率是指在特定时间段内,仍然继续使用某项产品或服务的用户占用户总数的百分比。 通常,留存率会以日,周,或月为单位进行统计和分析。 2.SQL留存率常见问题 1.计算新用户登录的日期的次日留存率以及3日留存率 …...

Java的锁机制详解
在并发编程中,锁 是用于控制多个线程对共享资源进行访问的工具。Java提供了多种锁机制,从最基础的 synchronized 到高级的 ReentrantLock,这些锁帮助我们确保线程安全,并能有效避免数据竞争和死锁问题。 1. synchronized 关键字…...

用户登录与信息管理:实现小程序登录与用户信息存储
用户登录与信息管理:实现小程序登录与用户信息存储 在现代的移动应用中,用户登录与信息管理是构建个性化用户体验的基础。小程序作为轻量级的应用形式,在简化开发流程的同时,也需要我们妥善管理用户的登录状态与用户信息。本文将…...

Java如何调用构造函数和方法以及使用
调用构造函数的格式 构造函数在创建新对象时被调用。调用格式如下: ClassName objectName new ClassName(parameters); ClassName:你需要创建其实例的类的名称。 objectName:你将创建的对象的名称。 parameters:如果你使用的是…...

TFBoys谁最重
题目 使用go语言设计一个程序计算TFBoys谁最重,要求使用结构体表示TFBoys三个成员,设计函数计算三个重量的最大值。 程序 package main import ("fmt") type Person struct {Name stringWeight float64} func (p Person) GetWeigh…...

scp 通过中间机器进行远程拷贝
有时候,我们想要通过 scp将一台机器上的文件拷贝至另外一台机器,但这两台机器可能没有直接联通,需要通过中间机器进行跳转才能访问,一个麻烦的办法就是,先将文件拷贝至中间机器,然后再从中间机器拷贝至另外…...

探索 Python 高精度计算的奥秘:mpmath 库全解析
文章目录 探索 Python 高精度计算的奥秘:mpmath 库全解析背景:为何选择 mpmath?第二部分:mpmath 是什么?第三部分:如何安装 mpmath?第四部分:mpmath 函数使用示例第五部分࿱…...

<<迷雾>> 第10章 用机器做一连串的加法(1)--使用两排开关分别给出被加数和加数 示例电路
info::操作说明 鼠标单击逻辑输入切换 0|1 状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch10-01-5-bit-adder.txt 原图...

Stable Diffusion最新版nowebui的api使用详解
最近在使用stable diffusion最新版的Stable Diffusion WebUI Forge进行api调用,下面来一步一步的进行展开吧!!! 1、下载lllyasviel/stable-diffusion-webui-forge GitHub - lllyasviel/stable-diffusion-webui-forgeContribute to lllyasviel/stable-diffusion-webui-for…...

云服务器架构详解:X86计算_ARM_GPU/FPGA/ASIC_裸金属_超级计算集群
阿里云服务器架构有什么区别?X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别?阿里云服务器网aliyunfuwuqi.com分享云服务器ECS架构详细说明: 阿里云服务器ECS架构说明 阿里云服务器ECS架构 X86计算 X86计算架…...

高级java每日一道面试题-2024年10月4日-数据库篇-MySQL索引底层结构为什么使用B+树?
如果有遗漏,评论区告诉我进行补充 面试官: MySQL索引底层结构为什么使用B树? 我回答: 该面试题本质还是在考察B树的数据结构和在数据库系统中的应用,下边是详细的回答。 B树的基本特性 B 树的结构特点 非叶子节点只存储键值信息,不存储…...

【JVM】内存分析工具JConsole/Visual VM
1 缘起 日常补充JVM调优,调优实践前需要学习一些理论做支撑, JVM调优三步:理论>GC分析>JVM调优, 我们会有一些玩笑话说,做了这么久Java开发,做过JVM调优吗? 做过,面试时。当然…...

一静 、二平 、三忍 、四让、五淡
一静 、二平 、三忍 、四让、五淡。 作者:儒风君 来源:儒风大家(ID: rufengdajia) 古人为人、处事、修身,都有独特的章法。 一静、二平、三忍、四让、五淡。 说透中国人的大智慧。 1 静 《道德经》里讲:“清静为天下正。”…...

js 深入理解函数(一):函数的本质
目录 概述1. 箭头函数2. 函数名 :指向函数的指针3. 理解参数3.1 arguments 对象的作用3.2 arguments 的注意点3.3 箭头函数中的参数 4. 没有重载5. 默认参数值5.1 ES 6 支持显示定义默认参数5.2 传 undefined 等于没有传值5.3 arguments 不反映参数默认值5.4 默认值…...

MySql表结构设计
创建 create table 表名(字段1 字段类型 [约束] [comment 字段1注释],...) [comment 表注释];约束是作用于表中字段上的规则,用于限制存储在表中的数据。它的目的是保证数据库中数据的正确性、有效性和完整性。 约束描述关键字非空约束限制该字段不能为nullnot nu…...

java:pdfbox 3.0 去除扫描版PDF中文本水印
官网下载 https://pdfbox.apache.org/download.html下载 pdfbox-app-3.0.3.jar cd D:\pdfbox 运行 java -jar pdfbox-app-3.0.3.jar java -jar pdfbox-app-3.0.3.jar Usage: pdfbox [COMMAND] [OPTIONS] Commands:debug Analyzes and inspects the internal structu…...

python知识点100篇系列(17)-替换requests的python库httpx
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,使用Requests可以轻而易举的完成浏览器可有的任何操作。 但是在python3.6之后,出现了一个requests的替代选项; httpx httpx是Python新一代的网络请求库…...