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 会首先根据参数判断文件的类型,然后根据不同的文件类型去找不同的设备驱动,继而进行读写或者输入输出控制

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

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

相关文章

大模型杀入HR赛道,AI能扮演好企业的“人才捕手”吗?

导读&#xff1a;生成式AI如何让HR回归本质。 当很多人焦虑未来会“被AI夺走工作”时&#xff0c;HR行业本身也在AI浪潮推动下发生巨变。 AI技术现已应用于人力资源管理的各个环节中。根据领英发布的《2024全球人才趋势报告》&#xff0c;61%的HR已经在使用AI相关技术辅助日常工…

主从复制mysql-replication | Replication故障排除

主从复制mysql-replication 准备环境 #防火墙 selinux systemctl stop firewalld --now &&setenforce 0 #修改主机名&#xff1a;hostnamectl set-hostname 名字 tip&#xff1a;vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPRTOTstatic IPADDR192.168.100.…

LDAP报文交互流程详解

LDAP报文交互流程通常包括以下步骤&#xff1a; 建立TCP连接&#xff1a;LDAP客户端首先通过TCP连接到LDAP服务器。默认情况下&#xff0c;LDAP使用端口389进行非安全通信&#xff0c;而使用端口636进行安全通信&#xff08;如SSL/TLS&#xff09;。 管理员绑定&#xff1a;客…

Python密码魔法:制作个性化、安全性满分的密码生成器秘籍!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 密码是保护个人信息安全的关键&#xff0c;而一个强密码生成器能够帮助用户创建高度安全的密码。本文将介绍如何使用 Python 制作一个简单而功能强大的密码生成器&#xff0c;涵盖了各种生成密码的方法、密码强度…

Linux数据库主从复制(单主单从)

MySQL主从复制的优点包括&#xff1a; 1、横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中&#xff0c;所有写入和更新都必须在主服务器上进行。但是&#xff0c;读取可以在一个或多个从设备上进行。该模型可以提高写入性能&#xff08;因为主设备专用于更新…

驾校抖音直播话术

1. 自我介绍 大家好&#xff0c;我是[教练姓名]&#xff0c;欢迎来到我的直播间&#xff01;我是一名专业的驾校教练&#xff0c;今天我将和大家分享一些关于学车的技巧和经验。 2. 引入话题 在学车过程中&#xff0c;选择一个好的驾校和教练是非常重要的。我们驾校拥有专业的…

5个未来AI的新趋势

人工智能正在迅速发展&#xff0c;通过询问业内的人工智能研究人员&#xff0c;根据他们的说法&#xff0c;人工智能将在未来几年内改变世界。以下是作为开发人员应该了解的未来 5 年人工智能的 5 大趋势。 1、可解释人工智能 可解释人工智能&#xff08;XAI&#xff09;是指…

JavaFX:Observable和ObservableValue的事件处理(invalidated和changed)

JavaFX提供了Observable接口和ObservableValue接口&#xff0c; 处理invalidated&#xff08;数据失效&#xff09;和changed&#xff08;数据更新&#xff09;事件。 示例一&#xff1a; 自定义类继承InvalidationListener接口&#xff0c;当数据失效时&#xff0c;触发该接…

kotlin ——数组

一、创建数组&#xff1a; 1、arrayOf val array arrayOf(1,2,3)2、arrayOfNulls val array1 arrayOfNulls<Int>(3)array1[0]2array1[1]12array1[2]253、动态创建数组(接受一个表达式)&#xff0c; Array 初始化为 [“0”, “1”, “4”, “9”, “16”,"36] val …

【接口测试】如何定位BUG的产生原因

我们从在日常功能测试过程中对UI的每一次操作说白了就是对一个或者多个接口的一次调用&#xff0c;接口的返回的内容(移动端一般为json)经过前端代码的处理最终展示在页面上。http接口是离我们最近的一层接口&#xff0c;web端和移动端所展示的数据就来自于这层&#xff0c;那么…

用C爬取人人文库并分析实现免积分下载资料

最近有个学妹学习遇到问题&#xff0c;想要的学习资料都在文库中&#xff0c;因为资料太多太杂&#xff0c;想要一篇篇找太难了&#xff0c;主要是太浪费精力了。因此&#xff0c;听说这个事情我能解决&#xff0c;立马找到我&#xff0c;给我一杯奶茶就把我收买了&#xff0c;…

【Seata源码学习 】 扫描@GlobalTransaction注解 篇一

1. SeataAutoConfiguration 自动配置类的加载 基于SpringBoot的starter机制&#xff0c;在应用上下文启动时&#xff0c;会加载SeataAutoConfiguration自动配置类 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigurationio.seata.spring.boot.aut…

DPDK单步跟踪(3)-如何利用visual studio 2019和visual gdb来单步调试dpdk

准备工作 因为时间的关系&#xff0c;我想到哪说到哪&#xff0c;可能没那么高的完成度。 但其实有心的人&#xff0c;看到这个标题&#xff0c;就关了本文自己能做了。 why和how to build debug version DPDK,见前两篇。这里我们准备开始。 首先&#xff0c;你有一台linux机…

Vue3入门精讲:一文讲透Vue3知识点

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃诸葛妙计&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解决技术难题。 &a…

使用redis-rds-tools 工具分析redis rds文件

redis-rdb-tools安装部署及使用 发布时间&#xff1a;2020-07-28 12:33:12 阅读&#xff1a;29442 作者&#xff1a;苏黎世1995 栏目&#xff1a;关系型数据库 活动&#xff1a;开发者测试专用服务器限时活动&#xff0c;0元免费领&#xff0c;库存有限&#xff0c;领完即止&…

算法题系列7·获得数组中多数元素

目录 题目描述 实现 提交结果 题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;…

第11章 GUI Page400~402 步骤二 画直线

运行效果&#xff1a; 源代码&#xff1a; /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…

rsync文件同步

场景&#xff1a;主要是用来发布文件。 一、rsync服务器端架设 1、安装 wget https://download.samba.org/pub/rsync/src/rsync-3.0.6.tar.gz tar -zxvf rsync-3.0.6.tar.gz ./configure --prefix/usr/local/rsync make make install 2、配置 2.1、配置rsyncd.conf 不存在…

SpringBoot不求甚解,Java小白入门(二)

一、什么是SpringBoot&#xff1f; 其实Springboot是Spring家族中的一个全新的框架&#xff0c;它是用来简单应用程序的创建和开发过程&#xff0c;化繁为简。 二、为什么要用SpringBoot&#xff1f; 因为现在大部分产品都是直接以SpringBoot为脚手架开发了&#xff0c;主流…

黑芝麻智能与亿咖通科技签署战略合作协议,深化协同助力智能驾驶量产落地

12月22日&#xff0c;全球智能汽车计算芯片引领者黑芝麻智能与全球出行科技企业亿咖通科技共同签署战略合作协议&#xff0c;通过深化合作&#xff0c;整合双方研发、产品和技术资源&#xff0c;联手打造领先智能驾驶系统解决方案&#xff0c;合力推进商业拓展和市场应用&#…