当前位置: 首页 > 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…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...