嵌入式入门Day27

IO day3

  • 文件IO
    • 文件描述符
      • 分配过程
    • 相关函数
  • 作业

在这里插入图片描述

文件IO

  1. 文件IO:基于系统调用的API函数接口
  2. 特点:每一次调用文件IO,系统都会从用户态到内核态之间切换,效率很低
  3. 作用:后期学习进程间通信,管道,SOCKET套接字通信,都会用到文件IO

文件描述符

  1. 本质上是一个非负整数,类似于标准IO打开文件时的 fp指针
  2. 进程执行时默认打开3个文件描述符0(stdin),1(stdout),2(stderr
  3. 文件描述符可以使用ulimit -a查看打开文件个数。使用 ll 查看文件权限
  4. 分配原则,按照最小未分配原则,而且每一个终端进程打开文件的个数是有限制的最多是1024个文件

分配过程

标准文件描述符:

  • 文件描述符 0:标准输入(stdin
  • 文件描述符 1:标准输出(stdout
  • 文件描述符 2:标准错误(stderr
  • 当您打开一个新文件时,操作系统会查找当前进程中未使用的最小文件描述符,并将其分配给新打开的文件。
  • 如果所有文件描述符都已被使用,您将无法打开更多文件,直到关闭某些文件或进程结束。
  • 关闭文件:使用 close函数关闭文件时,操作系统会释放该文件描述符,使其可以被后续的文件打开操作重新使用

相关函数

  1. open和close
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);功能:打开或者创建文件。参数1:文件的路径和文件名参数2:打开或者创建文件时的语义O_CREAT:创建文件O_RDONLY:只读模式O_WRONLY :只写模式O_RDWR:读写模式O_EXCL:如果文件存在就报错O_TRUNC:清空文件内容。O_APPEND:追加写的方式以上选项可以按照位或方式组合使用。参数3:可选项如果参数2有O_CREAT或者O_TMPFILE,参数3必须加上创建时的权限,如果没有参数3直接省略。参数3是文件或者文件夹创建时的权限。返回值:成功返回文件描述符,失败返回-1,并置位错误码。文件夹的默认最大权限是775,文件的默认最大权限是664。eg:w:open("./1.txt",O_CREAT|O_TRUNC|O_WRONLY,0664);r:open("./1.txt",O_RDONLY);r+:open("./1.txt",O_RDWR);w+:open("./1.txt",O_CREAT|O_TRUNC|O_RDWR,0664);a:open("./1.txt",O_CREAT|O_APPEND|O_WRONLY,0664);a+:open("./1.txt",O_CREAT|O_APPEND|O_RDWR,0664);还可以有以下使用规则:open("./1.txt",O_CREAT|O_EXCL|O_RDWR,0664);//只创建读写文件,如果文件存在就报错。open("./1.txt",O_CREAT|O_EXCL|O_TRUNC|O_WRONLY,0664);//只写创建,清空打开文件,如果文件存在就报错 int close(int fd);功能:关闭open函数打开的文件描述符。参数:文件描述符(文件句柄)返回值:成功返回0,失败返回-1,并置位错误码。
  1. write和read
#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);功能:向fd指向的描述符写入内容,写count个字节参数1:文件描述符参数2:写入的内容参数3:写入的字节数。返回值:成功返回写入的字节个数,如果什么都没写入返回0,失败返回-1,并置位错误码。ssize_t read(int fd, void *buf, size_t count);功能:从fd指向的文件读取count个字节到buf中参数1:文件描述符    参数2:读取的内容参数3:读取的字节数。返回值:成功返回读取的字节数,读取到文件末尾返回0,失败返回-1,并置位错误码。
  1. lseek
#include <sys/types.h>#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);功能:移动文件光标参数1:文件描述符参数2:偏移量>0:往后偏移<0:往前偏移=0:不偏移参数3:偏移的起始位置SEEK_SET:从文件的开头开始偏移SEEK_CUR:从当前位置开始偏移SEEK_END:从文件末尾开始偏移返回值:成功返回文件开头到光标之间的字节数,失败返回-1并置位错误码。eg:将光标偏移到文件末尾int len = lseek(fd,0,SEEK_END);     len是文件的总大小。 
  1. dup和dup2
    • dup和dup2在赋值(复制)新描述符时新旧描述符都共享光标
    • dup会产生新的描述符遵循最小未分配原则
    • dup2不会产生新的描述符,只会先将新描述符指向的文件关闭,然后重定向新描述符到旧描述符文件
#include <unistd.h>int dup(int oldfd);功能:将文件描述符拷贝一份生成新的描述符,新旧木薯淀粉指向同一个文件,并且共享文件光标。参数:旧的描述符。返回值:成功返回创建的新描述符,失败返回-1,并置位错误码。int dup2(int oldfd, int newfd);功能:将新的描述符重定向给旧的描述符,新的描述符指向的文件会被关闭,然后新旧描述符都指向旧的文件,并且共享文件光标。注意:dup2不会像dup那样产生新描述符并且也不会遵循最小未分配原则。返回值:成功返回原本新描述符,但是新描述符值没有变化(重定向到旧的描述符),失败返回-1并置位错误码。

作业

使用read和write实现拷贝文件,将1.txt内容的前一半和后一半分别拷贝给2.txt和3.txt

#include <myhead.h>int main(int argc, const char *argv[])
{int fd1 = open("./1.txt", O_RDONLY); 	//只读方式打开1.txtif (-1 == fd1){perror("open");return -1;}int fd2 = open("./2.txt", O_WRONLY | O_CREAT | O_TRUNC); 	//只写方式打开2.txtif (-1 == fd2){perror("open");return -1;}int fd3 = open("./3.txt", O_WRONLY | O_CREAT | O_TRUNC); 	//只写方式打开3.txtif (-1 == fd3){perror("open");return -1;}int len = lseek(fd1,0,SEEK_END); 	//计算1.txt的长度lseek(fd1,0,SEEK_SET); 				//光标重置char *buff = (char *)malloc(len/2+1); //定义数组用于存储数据int res = read(fd1,buff,len/2); 		//从fd1中读取前一半数据write(fd2,buff,res); 		//写入fd2中bzero(buff,len/2+1); 			//清空数组res = read(fd1,buff,len/2); 		//从fd1中读取后半段数据write(fd3,buff,res); 		//写入fd3中 close(fd1);close(fd2);close(fd3);return 0;
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复现论文:PromptTA: Prompt-driven Text Adapter for Source-freeDomain Generalization

github&#xff1a;zhanghr2001/PromptTA: Source-free Domain Generalization 论文&#xff1a;[2409.14163] PromptTA: Prompt-driven Text Adapter for Source-free Domain Generalization 自己标注&#xff1a;PromptTA: Prompt-driven Text Adapter for Source-free Domai…

记录 idea 启动 tomcat 控制台输出乱码问题解决

文章目录 问题现象解决排查过程1. **检查 idea 编码设置**2. **检查 tomcat 配置**3.检查 idea 配置文件4.在 Help 菜单栏中&#xff0c;修改Custom VM Options完成后保存&#xff0c;并重启 idea 问题现象 运行 tomcat 后&#xff0c;控制台输出乱码 解决排查过程 1. 检查 id…

《HTML 的变革之路:从过去到未来》

一、HTML 的发展历程 图片: HTML 从诞生至今&#xff0c;经历了多个版本的迭代。 &#xff08;一&#xff09;早期版本 HTML 3.2 在 1997 年 1 月 14 日成为 W3C 推荐标准&#xff0c;提供了表格、文字绕排和复杂数学元素显示等新特性&#xff0c;但因实现复杂且缺乏浏览器…

SQL注入--堆叠注入

一.基本概念 堆叠注入概念&#xff1a;在 SQL 中&#xff0c; 分号&#xff08;;&#xff09; 是用来表示一条 sql 语句的结束。 试想一下我们在 ; 结束一个 sql语句后继续构造下一条语句&#xff0c; 会不会一起执行&#xff1f; 因此这个想法也就造就了堆叠注入。 二.堆叠注入…

【论文阅读】PRIS: Practical robust invertible network for image steganography

内容简介 论文标题&#xff1a;PRIS: Practical robust invertible network for image steganography 作者&#xff1a;Hang Yang, Yitian Xu∗, Xuhua Liu∗, Xiaodong Ma∗ 发表时间&#xff1a;2024年4月11日 Engineering Applications of Artificial Intelligence 关键…

Linux DNS域名解析服务器

DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分 布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS 使用的是 53 端口&#xff0c; 通常 DNS 是以 UDP 这个较快速的数据传输协议…

LeetCode面试题04 检查平衡性

题目&#xff1a; 实现一个函数&#xff0c;检查二叉树是否平衡。在这个问题中&#xff0c;平衡树的定义如下&#xff1a;任意一个节点&#xff0c;其两棵子树的高度差不超过 1。 一、平衡树定义&#xff1a; 二叉树&#xff0c;一种由节点组成的树形数据结构&#xff0c;每…

Notable是一款优秀开源免费的Markdown编辑器

一、Notable简介 ‌ Notable‌是一款开源的跨平台Markdown编辑器&#xff0c;支持Linux、MacOS、Windows以及国产操作系统等多种主流操作系统。它以其高颜值和强大的功能&#xff0c;成为了许多用户的首选工具。 主要特性 实时预览‌&#xff1a; Notable提供了实时预览功能&…

安卓报错Switch Maven repository ‘maven‘....解决办法

例如&#xff1a;Switch Maven repository ‘maven(http://developer.huawei.com/repo/)’ to redirect to a secure protocol 在库链接上方添加配置代码&#xff1a;allowInsecureProtocol true

es实现上传文件查询

es实现上传文件查询 上传文件&#xff0c;获取文件内容base64&#xff0c;使用es的ingest-attachment文本抽取管道转换为文字存储 安装插件 通过命令行安装&#xff08;推荐&#xff09; 1.进入 Elasticsearch 安装目录 2.使用 elasticsearch-plugin 命令安装 bin/elastics…

采集opc ua转profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关采集OPC UA的数据 2 5 用PROFINET IO协议转发数据 4 6 案例总结 6 1 案例说明 设置网关采集OPC UA设备数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换…

linux 安装composer

下载composer curl -sS https://getcomposer.org/installer | php下载后设置环境变量&#xff0c;直接通过命令composer -v mv composer.phar /usr/local/bin/composer查看版本看是否安装成功 composer -v

可视化建模以及UML期末复习----做题篇

一、单项选择题。&#xff08;20小题&#xff0c;每小题2分,共40分&#xff09; 1、UML图不包括&#xff08; &#xff09; A、用例图 B、状态机图 C、流程图 D、类图 E、通信图 答案&#xff1a;C、流程图 UML中不包括传统意义上的流程图&#xff0c;流程图通常是指B…

VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

Mac mini m4本地跑大模型(ollama + llama + ComfyUI + Stable Diffusion | flux)

安装chat大模型&#xff08;不推荐&#xff0c;本地运行的大模型只能聊废话&#xff0c;不如网页版使用openAI等高效&#xff09; 首先下载ollama的安装包 https://ollama.com/ 点击启动访问&#xff1a;http://localhost:11434 Ollama is running 代表已经运行起来了&#x…

借助Aspose.Cells ,在 Excel 中将文本转换为数字

在 Excel 中将文本转换为数字是一项常见要求。许多用户会遇到以文本形式存储的数字&#xff0c;这可能会导致计算错误。此问题会影响财务、数据分析和报告。将这些文本条目转换为实际数字对于准确的数据处理至关重要。在这篇博文中&#xff0c;我们将探讨如何使用 C# 将以文本形…

2024 年 11 月区块链游戏研报:牛市加持下的 GameFi 破局之路

2024 年 11 月区块链游戏研报 作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics 区块链游戏 Research 页面 2024 年 11 月 Web3 游戏行业市场增长显著但大规模采用策略仍在演进。随着比特币创下历史新高并接近 10 万美元里程碑…

QT 多级嵌套结构体,遍历成员--半自动。<模板+宏定义>QTreeWidget树结构显示

Qt的QTreeWidget来显示嵌套结构体的成员&#xff0c;并以树形结构展示。 #include <QApplication> #include <QTreeWidget> #include <QTreeWidgetItem> #include <QString> #include <cstdint>// 假设这些是你的结构体定义 struct BaseMeterPa…

【JAVA高级篇教学】第一篇:Springboot对接通义千问大模型

博主今天打算讲解下Java如何对接阿里云的通义千问大模型&#xff0c;可以自己玩玩ai问答之类的&#xff01; 目录 一、发展历程 二、API-KEY的获取与配置 三、引用SDK 四、文本模型 1.代码 2.返回数据 3.官方代码案例 五、通义千问VL 1.计量计费 六、查看API-KEY调用额…

快捷构建AI大模型,源码自取可直接运行

Node.js 和 WebSocket 实现一个基于kimi&#xff08;Moonshot 月之暗大模型&#xff09;的AI工具 前端&#xff1a;前端界面比较容易&#xff0c;只需要简单的额css js即可&#xff0c;本文使用vue作为作为demo。 后端&#xff1a;我java很垃圾&#xff0c;写不出好的代码&am…