当前位置: 首页 > news >正文

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 学习任务&#xff1a; 1、 学习Linux 应用开发概念&#xff0c;什么是系统调用&#xff0c;什么是库函数 2、 学习文件IO&#xff1a;包括 read、write、open、close、lseek 3、 深入文件IO&#xff1a;错误处理、exit 等 4、 学习标准IO&a…...

PDF处理技巧:Windows电脑如何选择合适的 PDF 编辑器

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

【c++】初步了解类和对象2

1、类的作用域 类定义了一个新的作用域&#xff0c;类的所有成员都在类的作用域中。在类体外定义成员时&#xff0c;需要使用 :: 作用域操作符指明成员属于哪个类域。 如图&#xff0c;此时在类内声明了函数firstUniqChar()&#xff0c;在类外进行了函数体的具体定义。 但是却…...

Python库pandas之四

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

网络攻防技术--第三次作业

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

带隙基准Bandgap电路学习(一)

一、原理图 Bandgap中的运放&#xff08;折叠式Cascode&#xff09;采用P输入对&#xff0c;是因为运放输入端接的PNP三极管发射极端的电位&#xff0c;电压小&#xff0c;为了确保输入对管能够饱和工作&#xff0c;故采用P输入对管。此外&#xff0c;P管作为输入管&#xff0c…...

[前端][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这个链能更长吗&#xff1f; 在 LangChain 中&#xff0c;链&#xff08;chain&#xff09;可以根据需要变得非常长&#xff0c;并且可以包含多种不同类型的组件。链的目的是将多个步骤串联起来&#xff0c;以便以…...

STM32—SPI通讯协议

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

Android 安装过程五 MSG_INSTALL消息的处理 安装

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

大数据开发--1.3 Linux的常用命令大全

目录 一. 终端命令格式 命令格式 说明&#xff1a; 二. 显示文件列表命令 -ls 作用 格式 ls常用选项 案例 三. 目录操作命令 -pwd 作用 格式 案例 四. 目录操作命令 -cd 作用 格式 案例 五. 目录操作命令 -mkdir 作用 格式 案…...

使用PuTTY连接到Amazon Linux实例

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

Nexus搭建maven私有仓库

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

留存率的定义与SQL实现

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

Java的锁机制详解

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

用户登录与信息管理:实现小程序登录与用户信息存储

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

Java如何调用构造函数和方法以及使用

调用构造函数的格式 构造函数在创建新对象时被调用。调用格式如下&#xff1a; ClassName objectName new ClassName(parameters); ClassName&#xff1a;你需要创建其实例的类的名称。 objectName&#xff1a;你将创建的对象的名称。 parameters&#xff1a;如果你使用的是…...

TFBoys谁最重

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

scp 通过中间机器进行远程拷贝

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

探索 Python 高精度计算的奥秘:mpmath 库全解析

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

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...