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

嵌入式Linux应用开发-文件 IO

嵌入式Linux应用开发-文件 IO

  • 第四章 文件 IO
    • 4.1 文件从哪来?
    • 4.2 怎么访问文件?
      • 4.2.1 通用的 IO 模型:open/read/write/lseek/close
      • 4.2.2 不是通用的函数:ioctl/mmap
    • 4.3 怎么知道这些函数的用法?
    • 4.4 系统调用函数怎么进入内核?
    • 4.5 内核的 sys_open、sys_read 会做什么?

第四章 文件 IO

参考书:
在这里插入图片描述

这 2 本书的内容类似,第一本对知识点有更细致的描述,适合初学者;第二本比较直接,一上来就是各种函数的介绍,适合当作字典,不懂时就去翻看一下。
做纯 Linux 应用的入,看这 2 本书就可以了,不需要学习我们的视频。我们的侧重于“嵌入式 Linux”。

在 Linux 系统中,一切都是“文件”:普通文件、驱动程序、网络通信等等。所有的操作,都是通过“文
件 IO”来操作的。所以,很有必要掌握文件操作的常用接口。

4.1 文件从哪来?

在这里插入图片描述

4.2 怎么访问文件?

4.2.1 通用的 IO 模型:open/read/write/lseek/close

使用 GIT 下载所有源码后,本节源码位于如下目录:
01_all_series_quickstart\
04_嵌入式 Linux 应用开发基础知识\source\06_fileio\copy.c

copy.c 源码如下:


#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> /* 
* ./copy 1.txt 2.txt 
* argc = 3 
* argv[0] = "./copy" 
* argv[1] = "1.txt" 
* argv[2] = "2.txt" 
*/ 
int main(int argc, char **argv) 
{ int fd_old, fd_new; char buf[1024]; int len; /* 1. 判断参数 */ if (argc != 3) { printf("Usage: %s <old-file> <new-file>\n", argv[0]); return -1; } /* 2. 打开老文件 */ fd_old = open(argv[1], O_RDONLY); if (fd_old == -1) { printf("can not open file %s\n", argv[1]); return -1; } /* 3. 创建新文件 */ fd_new = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (fd_new == -1) { printf("can not creat file %s\n", argv[2]); return -1; } /* 4. 循环: 读老文件-写新文件 */ while ((len = read(fd_old, buf, 1024)) > 0) { if (write(fd_new, buf, len) != len) { printf("can not write %s\n", argv[2]); return -1; } } /* 5. 关闭文件 */ close(fd_old); close(fd_new); return 0; 
} 

本节源码完全可以在 Ubuntu 上测试,跟在 ARM 板上没什么不同。
执行以下命令编译、运行:

$ gcc -o copy copy.c 
$ ./copy copy.c new.c 

4.2.2 不是通用的函数:ioctl/mmap

使用 GIT 下载所有源码后,本节源码位于如下目录:
01_all_series_quickstart\
04_嵌入式 Linux 应用开发基础知识\source\06_fileio\copy_mmap.c

在 Linux 中,还可以把一个文件的所有内容映射到内存,然后直接读写内存即可读写文件。

 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <sys/mman.h> /* 
* ./copy 1.txt 2.txt 
* argc = 3 
* argv[0] = "./copy" 
* argv[1] = "1.txt" 
* argv[2] = "2.txt" 
*/ 
int main(int argc, char **argv) 
{ int fd_old, fd_new; struct stat stat; char *buf; /* 1. 判断参数 */ if (argc != 3) { printf("Usage: %s <old-file> <new-file>\n", argv[0]); return -1; } /* 2. 打开老文件 */ fd_old = open(argv[1], O_RDONLY); if (fd_old == -1) { printf("can not open file %s\n", argv[1]); return -1; } /* 3. 确定老文件的大小 */ if (fstat(fd_old, &stat) == -1) { printf("can not get stat of file %s\n", argv[1]); return -1; } /* 4. 映射老文件 */ buf = mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, fd_old, 0); if (buf == MAP_FAILED) { printf("can not mmap file %s\n", argv[1]); return -1; } /* 5. 创建新文件 */ fd_new = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (fd_new == -1) { printf("can not creat file %s\n", argv[2]); return -1; } /* 6. 写新文件 */ if (write(fd_new, buf, stat.st_size) != stat.st_size) { printf("can not write %s\n", argv[2]); return -1; } /* 5. 关闭文件 */ close(fd_old); close(fd_new); return 0; 
} 

本节源码完全可以在 Ubuntu 上测试,跟在 ARM 板上没什么不同。
执行以下命令编译、运行:

$ gcc -o copy_mmap copy_mmap.c 
$ ./copy_mmap copy_mmap.c new2.c 

4.3 怎么知道这些函数的用法?

Linux 下有 3 大帮助方法:help、man、info。
想查看某个命令的用法时,比如查看 ls 命令的用法,可以执行:

ls --help

help 只能用于查看某个命令的用法,而 man 手册既可以查看命令的用法,还可以查看函数的详细介绍
等等。它含有 9 大分类,如下:

1 Executable programs or shell commands // 命令 
2 System calls (functions provided by the kernel) // 系统调用,比如 man 2 open 
3 Library calls (functions within program libraries) // 函数库调用 
4 Special files (usually found in /dev) // 特殊文件, 比如 man 4 tty 
5 File formats and conventions eg /etc/passwd // 文件格式和约定, 比如 man 5 passwd 
6 Games // 游戏 
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) //杂 
8 System administration commands (usually only for root) // 系统管理命令 
9 Kernel routines [Non standard] // 内核例程 

比如想查看 open 函数的用法时,可以直接执行“man open”,发现这不是想要内容时再执行“man 2
open”。
在 man 命令中可以及时按“h”查看帮助信息了解快捷键。常用的快捷键是:

f 往前翻一页 
b 往后翻一页 
/patten 往前搜 
?patten 往后搜 

就内容来说,info 手册比 man 手册编写得要更全面,但 man 手册使用起来更容易些。
以书来形容 info 手册和 man 手册的话,info 手册相当于一章,里面含有若干节,阅读时你需要掌握如
果从这一节跳到下一节;而 man 手册只相当于一节,阅读起来当然更容易。
就个人而言,我很少使用 info 命令。
可以直接执行“info”命令后,输入“H”查看它的快捷键,在 info 手册中,某一节被称为“node”,
常用的快捷键如下:

Up Move up one line. 
Down Move down one line. 
PgUp Scroll backward one screenful. 
PgDn Scroll forward one screenful. 
Home Go to the beginning of this node. 
End Go to the end of this node. TAB Skip to the next hypertext link. 
RET Follow the hypertext link under the cursor. 
l Go back to the last node seen in this window. 
[ Go to the previous node in the document. 
] Go to the next node in the document. 
p Go to the previous node on this level. 
n Go to the next node on this level. 
u Go up one level. 
t Go to the top node of this document. 
d Go to the main 'directory' node. 

4.4 系统调用函数怎么进入内核?

在这里插入图片描述

4.5 内核的 sys_open、sys_read 会做什么?

在这里插入图片描述

相关文章:

嵌入式Linux应用开发-文件 IO

嵌入式Linux应用开发-文件 IO 第四章 文件 IO4.1 文件从哪来&#xff1f;4.2 怎么访问文件&#xff1f;4.2.1 通用的 IO 模型&#xff1a;open/read/write/lseek/close4.2.2 不是通用的函数&#xff1a;ioctl/mmap 4.3 怎么知道这些函数的用法&#xff1f;4.4 系统调用函数怎么…...

【C++】多态,从使用到底层。

文章目录 前言一、多态的概念二、多太的定义和实现2.1 多太的构造条件2.2 虚函数2.3 重写(覆盖)2.4 C11 override 和 final2.5 重载&#xff0c;隐藏&#xff0c;重写 三、多态的原理3. 1虚函数表3.2 虚函数表如何完成多态的功能3.3 虚函数表存储在内存空间的那个区域&#xff…...

uvm白皮书练习_ch2_ch221只有driver的验证平台之*2.2.1 最简单的验证平台

uvm白皮书练习 ch221 dut.sv 这个DUT的功能非常简单&#xff0c;通过rxd接收数据&#xff0c;再通过txd发送出去。其中rx_dv是接收的数据有效指示&#xff0c;tx_en是发送的数据有效指示。 module dut (clk,rst_n,rxd,rx_dv,txd,tx_en );input clk ; input rst_n ; in…...

服务断路器_Resilience4j超时降级

创建模块cloud-consumer-resilience4j-order80 POM引入依赖 <dependencies><!-- 引入Eureka 客户端依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</a…...

【知识点随笔分析】我看看谁还不会用CURL命令

目录 前言&#xff1a; CURL介绍&#xff1a; CURL的基本使用&#xff1a; CURL与PING命令的区别&#xff1a; CURL命令的应用&#xff1a; 总结&#xff1a; 前言&#xff1a; 当今互联网时代&#xff0c;与服务器进行数据交互成为了无法回避的需求。无论是获取Web…...

ICCV 2023|Occ2Net,一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法...

本文为大家介绍一篇入选ICCV 2023的论文&#xff0c;《Occ2Net: Robust Image Matching Based on 3D Occupancy Estimation for Occluded Regions》&#xff0c; 一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法。 论文链接&#xff1a;https://arxiv.org/abs/23…...

leetcode - 14. Longest Common Prefix

Description Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string “”. Example 1: Input: strs ["flower","flow","flight"] Output: "…...

MySQL-查询语句语法(DQL)结构(查询操作 一)

SQL语句 编写顺序 - 执行顺序 1、SELECT 字段列表 4 2、FROM 表名列表 1 3、WHERE 条件列表 2 4、GROUP BY 分组字段列表 …...

SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…...

工地临时用电之智慧用电:全方位保障用电安全

随着科技进步和智能化的发展&#xff0c;工地用电管理也迎来了智慧化的革新。智慧用电&#xff0c;作为智慧工地的重要组成部分&#xff0c;通过集中式管理和创新的技术手段&#xff0c;为工地提供了全方位的用电安全保障。 针对工地临时用 的现状及系统结构&#xff0c;力安科…...

JumpServer开源堡垒机与爱可生云树数据库完成兼容性认证

近日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布&#xff0c;JumpServer开源堡垒机已经完成与爱可生云树数据库软件的兼容性认证。经过双方联合测试&#xff0c;云树数据库软件&#xff08;简称&#xff1a;ActionDB&#xff09;V1.0与杭州飞致云信息科技有限公司…...

信息化发展64

信息化体系 信息化代表了一种信息技术被高度应用&#xff0c;信息资源被高度共享&#xff0c;从而使得人的智能潜力以及社会物质资源潜力被充分发挥&#xff0c;个人行为、组织决策和社会运行趋于合理化的理想状态。 1997年召开的首届全国信息化工作会议&#xff0c;对信息化和…...

什么是全媒体整合营销?如何做好全媒体整合营销呢?

互联网发展进入深水区&#xff0c;目前营销大部分工作都与网络有关&#xff0c;网络营销形成各种分支&#xff0c;媒体平台的类型越来越多&#xff0c;如今的互联网发展背景下企业如何做好网络营销呢&#xff1f;小马识途营销顾问团队普遍认为企业当今应该开展的全媒体整合营销…...

系统集成|第十六章(笔记)

目录 第十六章 信息&#xff08;文档&#xff09;和配置管理16.1 文档管理16.2 配置管理 上篇&#xff1a;第十五章、采购管理 下篇&#xff1a;第十七章、变更管理 第十六章 信息&#xff08;文档&#xff09;和配置管理 16.1 文档管理 信息系统项目相关信息&#xff08;文档…...

hive数据库操作,hive函数,FineBI可视化操作

1、数据库操作 1.1、创建数据库 create database if not exists myhive;use myhive;1.2、查看数据库详细信息 desc database myhive;数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的&#xff1a;/user/hive/warehouse内 1.3、创建数据库并指定hdfs存…...

信息学奥赛一本通 2075:【21CSPJ普及组】插入排序(sort) | 洛谷 P7910 [CSP-J 2021] 插入排序

【题目链接】 ybt 2075&#xff1a;【21CSPJ普及组】插入排序&#xff08;sort&#xff09; 洛谷 P7910 [CSP-J 2021] 插入排序 【题目考点】 1. 排序&#xff1a; 插入排序 插入排序示例&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int…...

基于微信小程序的民宿短租酒店预订系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...

Python第二次作业(2)【控制台界面】

要求&#xff1a;使用Python输出五个控制台界面 第一张&#xff1a; 代码如下&#xff1a; print(" 英雄联盟商城登录界面 ") print("~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*") print(" 1.用户登录 &q…...

conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决

conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决 报错信息&#xff1a; Collecting package metadata (current_repodata.json): - ERROR conda.auxlib.logz:stringify(171): Traceback (most recent call last): File “C:\Users\dandelion…...

卤制品配送经营商城小程序的用处是什么

卤制品也是食品领域重要的分支&#xff0c;尤其对年轻人来说&#xff0c;只要干净卫生好吃价格合理&#xff0c;那复购率宣传性自是不用说&#xff0c;而随着互联网发展&#xff0c;传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

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

目录 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…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...