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

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

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

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

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...