嵌入式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 会做什么?
相关文章:
![](https://img-blog.csdnimg.cn/d9856fb97d214f368089788abac86c38.png)
嵌入式Linux应用开发-文件 IO
嵌入式Linux应用开发-文件 IO 第四章 文件 IO4.1 文件从哪来?4.2 怎么访问文件?4.2.1 通用的 IO 模型:open/read/write/lseek/close4.2.2 不是通用的函数:ioctl/mmap 4.3 怎么知道这些函数的用法?4.4 系统调用函数怎么…...
![](https://img-blog.csdnimg.cn/309006ec01724a1a97fc3c00c3f523e3.png)
【C++】多态,从使用到底层。
文章目录 前言一、多态的概念二、多太的定义和实现2.1 多太的构造条件2.2 虚函数2.3 重写(覆盖)2.4 C11 override 和 final2.5 重载,隐藏,重写 三、多态的原理3. 1虚函数表3.2 虚函数表如何完成多态的功能3.3 虚函数表存储在内存空间的那个区域ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
uvm白皮书练习_ch2_ch221只有driver的验证平台之*2.2.1 最简单的验证平台
uvm白皮书练习 ch221 dut.sv 这个DUT的功能非常简单,通过rxd接收数据,再通过txd发送出去。其中rx_dv是接收的数据有效指示,tx_en是发送的数据有效指示。 module dut (clk,rst_n,rxd,rx_dv,txd,tx_en );input clk ; input rst_n ; in…...
![](https://img-blog.csdnimg.cn/img_convert/5e3292cd8ca3c4fb7b913fbdaeedc5f9.png)
服务断路器_Resilience4j超时降级
创建模块cloud-consumer-resilience4j-order80 POM引入依赖 <dependencies><!-- 引入Eureka 客户端依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</a…...
![](https://img-blog.csdnimg.cn/69e9169c980f43e0aad31ff9ada88a9c.png)
【知识点随笔分析】我看看谁还不会用CURL命令
目录 前言: CURL介绍: CURL的基本使用: CURL与PING命令的区别: CURL命令的应用: 总结: 前言: 当今互联网时代,与服务器进行数据交互成为了无法回避的需求。无论是获取Web…...
![](https://img-blog.csdnimg.cn/img_convert/903826f0907a89e8c58dac46f5d22243.png)
ICCV 2023|Occ2Net,一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法...
本文为大家介绍一篇入选ICCV 2023的论文,《Occ2Net: Robust Image Matching Based on 3D Occupancy Estimation for Occluded Regions》, 一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法。 论文链接:https://arxiv.org/abs/23…...
![](https://www.ngui.cc/images/no-images.jpg)
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: "…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL-查询语句语法(DQL)结构(查询操作 一)
SQL语句 编写顺序 - 执行顺序 1、SELECT 字段列表 4 2、FROM 表名列表 1 3、WHERE 条件列表 2 4、GROUP BY 分组字段列表 …...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
SWAT-MODFLOW地表水与地下水耦合
耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果,SWAT作为一个地表水模型可以较好的模拟主要的水文过程,包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等,但是对于地下水部分的模拟相对粗糙,考虑到SWAT…...
![](https://img-blog.csdnimg.cn/cef382b596b14f569e04a3fa0cbd1a93.png)
工地临时用电之智慧用电:全方位保障用电安全
随着科技进步和智能化的发展,工地用电管理也迎来了智慧化的革新。智慧用电,作为智慧工地的重要组成部分,通过集中式管理和创新的技术手段,为工地提供了全方位的用电安全保障。 针对工地临时用 的现状及系统结构,力安科…...
![](https://img-blog.csdnimg.cn/63ad0fa77aef4a12b6f8b4d7a02a1191.png#pic_center)
JumpServer开源堡垒机与爱可生云树数据库完成兼容性认证
近日,中国领先的开源软件提供商FIT2CLOUD飞致云宣布,JumpServer开源堡垒机已经完成与爱可生云树数据库软件的兼容性认证。经过双方联合测试,云树数据库软件(简称:ActionDB)V1.0与杭州飞致云信息科技有限公司…...
![](https://www.ngui.cc/images/no-images.jpg)
信息化发展64
信息化体系 信息化代表了一种信息技术被高度应用,信息资源被高度共享,从而使得人的智能潜力以及社会物质资源潜力被充分发挥,个人行为、组织决策和社会运行趋于合理化的理想状态。 1997年召开的首届全国信息化工作会议,对信息化和…...
![](https://www.ngui.cc/images/no-images.jpg)
什么是全媒体整合营销?如何做好全媒体整合营销呢?
互联网发展进入深水区,目前营销大部分工作都与网络有关,网络营销形成各种分支,媒体平台的类型越来越多,如今的互联网发展背景下企业如何做好网络营销呢?小马识途营销顾问团队普遍认为企业当今应该开展的全媒体整合营销…...
![](https://img-blog.csdnimg.cn/8c26c673f47f445892843051f46dd850.png)
系统集成|第十六章(笔记)
目录 第十六章 信息(文档)和配置管理16.1 文档管理16.2 配置管理 上篇:第十五章、采购管理 下篇:第十七章、变更管理 第十六章 信息(文档)和配置管理 16.1 文档管理 信息系统项目相关信息(文档…...
![](https://img-blog.csdnimg.cn/1e7677799aed4d2eb72502cbe573b914.png)
hive数据库操作,hive函数,FineBI可视化操作
1、数据库操作 1.1、创建数据库 create database if not exists myhive;use myhive;1.2、查看数据库详细信息 desc database myhive;数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的:/user/hive/warehouse内 1.3、创建数据库并指定hdfs存…...
![](https://www.ngui.cc/images/no-images.jpg)
信息学奥赛一本通 2075:【21CSPJ普及组】插入排序(sort) | 洛谷 P7910 [CSP-J 2021] 插入排序
【题目链接】 ybt 2075:【21CSPJ普及组】插入排序(sort) 洛谷 P7910 [CSP-J 2021] 插入排序 【题目考点】 1. 排序: 插入排序 插入排序示例: #include <bits/stdc.h> using namespace std; int main() {int…...
![](https://img-blog.csdnimg.cn/img_convert/5b51d24960a4533a68f4ed38059b1ca1.png)
基于微信小程序的民宿短租酒店预订系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...
![](https://img-blog.csdnimg.cn/ab24ac3c246e451c9f7dcf8c07c2b346.png)
Python第二次作业(2)【控制台界面】
要求:使用Python输出五个控制台界面 第一张: 代码如下: print(" 英雄联盟商城登录界面 ") print("~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*") print(" 1.用户登录 &q…...
![](https://www.ngui.cc/images/no-images.jpg)
conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决
conda创建环境在Collecting package metadata (current_repodata.json)时报错的解决 报错信息: Collecting package metadata (current_repodata.json): - ERROR conda.auxlib.logz:stringify(171): Traceback (most recent call last): File “C:\Users\dandelion…...
![](https://img-blog.csdnimg.cn/img_convert/ab9ed750c59bbd75342d29577682cafe.png)
卤制品配送经营商城小程序的用处是什么
卤制品也是食品领域重要的分支,尤其对年轻人来说,只要干净卫生好吃价格合理,那复购率宣传性自是不用说,而随着互联网发展,传统线下门店也须要通过线上破解难题或进一步扩大生意。 而商城小程序无疑是商家通过线上私域…...
![](https://www.ngui.cc/images/no-images.jpg)
信息化发展65
1.2现代化基础设施 基础设施包括交通、能源、水利、物流等以传统基础设施和信息网络为核心的新型基础设施,在国家发展全局中具有战略性、基础性、先导性作用。统筹推进传统基础设施和新型基础设施建设,打造系统完备、高效实用、智能绿色、安全可靠的现代…...
![](https://img-blog.csdnimg.cn/3645bdfbd1d94e67ab9a35fde9b85dc4.png)
pytho实例--pandas读取表格内容
前言:由于运维反馈帮忙计算云主机的费用,特编写此脚本进行运算 如图,有如下excel数据 计算过程中需用到数据库中的数据,故封装了一个读取数据库的类 import MySQLdb from sshtunnel import SSHTunnelForwarderclass SSHMySQL(ob…...
![](https://www.ngui.cc/images/no-images.jpg)
处理飞书在线文档导出Word后无法自动编号问题
处理飞书在线文档导出Word后无法自动编号问题 解题思路:处理效果处理代码测试数据 最近工作中经常编写一些文档,有些文档需要多人协作完成。这两天需要完成一个可研的初稿,同事使用了飞书的在线文档。第一次使用飞书进行文档协作,…...
![](https://img-blog.csdnimg.cn/f798ba8d6ae4433083d637821d398245.png)
C++刷题 全排列问题
C刷题 全排列问题 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 #include <iostream>using namespace std;const int maxn 11;//P为当前排列,hashTable记录整数x是否已经在P中 int n, P[maxn], hashTable[maxn] {false};//当前处理排列的第index号…...
![](https://www.ngui.cc/images/no-images.jpg)
求数列a+aa+aaa+aaaa+......前n项和,a和n均由输入获得。
求数列aaaaaaaaaa…前n项和,a和n均由输入获得。 输入格式: 输入两个正整数a和n,两个数之间用逗号分隔。 输出格式: 输出"aaaaaaaaaa…和"的形式,详见输出样例。 输入样例: 在这里给出一组输入。例如: 3,6 输出样例:…...
![](https://img-blog.csdnimg.cn/ff9b94dbb28046e1a15cd765414ebd03.gif)
ElementUI之首页导航+左侧菜单->mockjs,总线
mockjs总线 1.mockjs 什么是Mock.js 前后端分离开发开发过程当中,经常会遇到以下几个尴尬的场景: - 老大,接口文档还没输出,我的好多活干不下去啊! - 后端小哥,接口写好了没,我要测试啊&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
文心大模型写TodoList项目需求
大模型写TodoList项目需求 提示词 你是一名资深的互联网软件行业产品经理。 现在要设计一个todo-list项目,它有哪些功能和需求? 分条目写出需求大纲。 文心大模型输出 设计一个Todo-list项目时,需要考虑以下功能和需求: 基本功能: 创建任…...
![](https://www.ngui.cc/images/no-images.jpg)
使用applescript自动化trilium的数学公式环境(二)
9.23 ver1 没想到今天很有精神,在玩chatgpt的时候突然想到,为什么不让他帮我写一份代码呢?说干就干。但是,可能是因为我的英语不怎么样,chatgpt生成出来的整个东西实在是菜的抠脚。所以我觉得还是应该自己先想好一个大…...
![](https://img-blog.csdnimg.cn/fb95a0ec796a4129a69622ae884e26b7.png)
机器学习与数据挖掘第三、四周
为什么第二周没有呢……因为刚换老师,自学要适应一段时间。 本课程作者之后的学习目标是:实操代码,至少要将作者参加数学建模中用到的数据处理方法都做一遍。 首先,作者复习一下李宏毅老师的两节课程。 机器学习概述 机器学习就…...
![](https://img-blog.csdnimg.cn/img_convert/d03c550202dbc34295ff5ec314fd6bf3.jpeg)
黎明加水印微信小程序源码 支持流量主接入
黎明加水印微信小程序源码,支持流量主接入。支持从聊天记录选择文件、相机拍摄、直接选择文件 支持白底、黑底的隐形水印,制作后,通过增加蒙版方能看到水印 纯前端,可嵌入任何项目。 部署教程 1、解压后得到项目文件夹 3、把…...
![](https://img-blog.csdnimg.cn/20210201161457194.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyNDQ3MzIx,size_16,color_FFFFFF,t_70)
网站建设金手指稳定/百度首页排名优化服务
目录 第一部 Java入门 第二部 开发框架【知识深度升华】 第三部 【扩展知识广度】 第四部 【源码学习】 第一部 Java入门 (根据你聪明智慧:建议快速游览大致了解都是有什么东东就行了) https://www.nowcoder.com/stack/23 jav…...
![](/images/no-images.jpg)
公司如何登录网站做就业登记/如何做好seo基础优化
第一题:账户类 题目描述 定义一个基类Account,数据成员包含string类变量userName用于保存账户主人姓名,函数成员包括默认构造函数、带参构造函数用于初始化数据成员和输出姓名的成员函PrintName()。从Account类派生出CreditAccount类…...
![](/images/no-images.jpg)
网站的分页效果怎么做/想学销售去哪培训
转载于:https://blog.51cto.com/noo2008/41504...
![](https://yqfile.alicdn.com/img_50d2f0538e701e9c08b4c3452e8f2d79.png)
扬州品牌网站设计/友链购买有效果吗
这本书是2016年8月出版的,一年半之后再看,虽然AI风口已过,但是由此延伸而来的概念正在引导出更深的内涵。 何谓大数据?作者的观点是体量大、维度高、及时性强。 为了说明数据的威力,书中举了许多例子。印象最深的一个是…...
![](https://oscimg.oschina.net/oscnet/fbd9a3e8ff2727fae606f1ca5ad7bd4e7c3.jpg)
余江区建设局网站/江阴网站制作公司
开发四年只会写业务代码,分布式高并发都不会还做程序员? Python 创始人 Guido van Rossum 前段时间宣布脱离 Python 决策层,辞去所谓的 BDFL (终生仁慈的独裁者) 身份曾引发热议,当时他以 PEP 572 改进提案的争吵事件为例&#…...
![](/attachment/201104/1/20639775_1301638732qZf3.jpg)
wordpress后台修改文章浏览数/最新消息新闻头条
KeepalivedLVSMysql-Cluster(7.1.10)的安装配置NDB Cluster的硬件需求: 管理节点:对硬件没什么要求,差 一点的机器完全能够胜任 数据节点:可以选择大内存,cpu也相对来讲不错 的,尤其是以后ndbmtd对多核Cpu的支持 Mysql节 点&#…...