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

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义