im6ull学习归纳总结(一)APP——04_文件IO

2023-12-22 01:36
文章标签 学习 总结 app 归纳 04 io im6ull

本文主要是介绍im6ull学习归纳总结(一)APP——04_文件IO,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4.1文件从何而来

在这里插入图片描述
如图所示文件可以是
1真实文件保存在设备上
2内核提供的虚拟文件
3设备节点

4.2文件的访问方式

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

实验1 copy文件
代码

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(char argc, char **argv)
{int fd_old ,fd_new;char buf[1024];int len;if (argc != 3){printf("Usage: %s <old-file> <new-file>",argv[0]);return -1;}fd_old = open(argv[1],O_RDONLY);if (fd_old == -1){printf("can not open file %s\n",argv[1]);return -1;}/*open函数用于打开 创建 文件O_WRONLY 只写方式O_CREAT如果文件不存在则创建文件O_TRUNC如果文件已经存在则截断文件(截断就是将文件大小设置为0清空文件)S_IRUSR这里分别表示设置用户(owner)具有读取权限  USR是设置用户OWNERS_IWUSR这里分别表示设置用户(owner)具有写权限S_IRGRP组具有读取权限S_IWGRP组具有写权限  GRP是组S_IROTH其他用户有读权限S_IROTH其他用户有写权限  OTH是其他*/fd_new = open(argv[2],O_WRONLY |O_CREAT |O_TRUNC,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWGRP | S_IROTH | S_IWOTH);if(fd_new==-1){printf("can not creat file %s \n",argv[2]);return -1;}/* read函数 参数1 要读取的文件描述符或套接字参数2 读取数据的缓冲区指针参数3 要读取的字节数read 函数的返回值 成功读取返回读取的字节数读完到达文尾 返回0发生错误翻入-1*//* 当返回0时读完跳出循环 */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;}}
close(fd_old);
close(fd_new);
return 0;
}

实验现象
在这里插入图片描述
完成复制

这里逻辑简单
终端中参数 不为3 打印用法否则正常运行

这里注意
read 函数从文件中读取数据,它并不关心文件的读取位置(file offset)。文件的读取位置是由文件描述符(file descriptor)维护的,而不是由 read 函数控制。

当你打开一个文件时,文件描述符的读取位置通常位于文件的开头,但每次读取操作后,文件描述符的读取位置都会根据已读取的字节数进行移动。这是因为文件描述符会跟踪已读取的字节数,以便下一次读取可以继续从上次读取结束的地方开始。

文件描述符中包含一个文件偏移量(file offset)的信息,该偏移量表示下一次读写操作将在文件中的哪个位置发生。文件描述符的文件偏移量是由系统内核维护的,它跟踪文件中的当前位置。每个进程的每个文件描述符都有自己的文件偏移量。

当你打开文件时,文件偏移量通常被设置为文件的开头。每次读取或写入操作完成后,文件偏移量都会相应地被更新,以指示下一次读写将从哪里开始。

文件描述符的值并没有变
文件描述符 (fd) 是一个整数值,它在文件的生命周期内保持不变。在文件打开时,文件描述符被分配,它代表了一个与文件相关联的资源。这个值在文件打开时被设置,并且在关闭文件时被释放。

非通用函数 ioctl、mmap

用mmap实现文件复制

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>int main(char argc, char **argv)
{int fd_old,fd_new;struct stat stat;char * buf;if(argc != 3){printf("Usage:%s <old_file> <new_file>\n",argv[0]);return -1;}fd_old = open(argv[1],O_RDONLY);/* 打开旧文件 */if(fd_old==-1){printf("can not open file %s\n",argv[1]);return -1;}/* fstat 获取fd_old文件信息并保存在stat结构体中*/if (fstat(fd_old,&stat)==-1){printf("can not get stat of file %s \n",argv[1]);return -1;}/* 将描述符为fd_old的文件映射到虚拟内存上 NULL为映射内存首地址由系统自动分配stat.st_size,映射区大小也是文件大PROT_READ表示对该区域的访问为只读权限MAP_SHARED表示其他进程也可以共享该区域的内容mmap函数返回的是映射区域的起始地址这样先将old文件映射到虚拟内存上,将虚拟内存的首地址给buf,再从buf的首地址开始将值写入new文件中*/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;}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;}if (write(fd_new,buf,stat.st_size)!=stat.st_size){printf("can not write %s \n",argv[2]);return -1;}close(fd_new);close(fd_old);return 0;}

现象:
在这里插入图片描述
文件已经被复制了

查看函数用法的方法

help 用于查看命令用法

ls --help查看ls命令用法

info 查看命令、函数的具体用法

例如 info ls
info open

man man 相当于比info简单

例如 man ls
man open
基本用man

系统调用函数进入内核的过程

在这里插入图片描述
我们程序中调用的open read write 函数是用户态调用的API

内核sys_open、sys_read的作用

在这里插入图片描述
进入内核后,sys_read/open 会首先根据参数判断文件的类型,然后根据不同的文件类型去找不同的设备驱动,继而进行读写或者输入输出控制

这篇关于im6ull学习归纳总结(一)APP——04_文件IO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/522186

相关文章

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法