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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10 个顶级免费 Android 数据恢复软件可帮助恢复已删除的文件

不小心删除了手机上的一些重要数据或文件&#xff1f;这很不幸&#xff0c;但不要悲伤或放弃希望&#xff0c;因为仍有机会恢复它们。 10 个顶级免费 Android 数据恢复软件 虽然 Android 手机没有像 Windows 那样的回收站可以自动存储您删除的数据&#xff0c;但是有很多功能强…

大模型时代下的因果推断

导读&#xff1a;在数字化建设不断推进的今天&#xff0c;随着技术的不断发展&#xff0c;从统计学、机器学习、深度学习&#xff0c;再到因果学习&#xff0c;以及最新的热门大模型方向&#xff0c;九章云极DataCanvas始终紧贴最前沿的、最能助力企业和落地实践的方向&#xf…

合伙企业的优缺点是什么

合伙企业的优缺点是什么 一、合伙企业的优点 合伙企业在资本扩张方面较个人独资企业更有优势。个人独资企业仅有一个投资人&#xff0c;尽管存在整个家庭财产成为个人独资企业资本来源的情形&#xff0c;但该类企业资本规模相对较小、抗风险能力较弱。为扩张资本&#xff0c;单…

通过U盘:将电脑进行重装电脑

目录 一.老毛桃制作winPE镜像 1.制作准备 2.具体制作 下载老毛桃工具 插入U盘 选择制作模式 正式配置U盘 安装提醒 安装成功 具体操作 二.使用ultrasio制作U盘 1.具体思路 2.图片操作 三.硬盘安装系统 具体操作 示例图 ​编辑 一.老毛桃制作winPE镜像 1.制作准…

基本数据类型变量间的运算规则、基本数据类型与String的运算

目录 一、自动类型提升 二、强制类型转换 三、基本数据类型与String的运算 1 字符串类型&#xff1a;String 2 运算规则 在Java程序中&#xff0c;不同的基本数据类型&#xff08;只有7种&#xff0c;不包含boolean类型&#xff09;变量的值经常需要进行相互转换。转换的方…

产品原型设计软件 Axure RP 9 mac支持多人写作设计

axure rp 9 mac是一款产品原型设计软件&#xff0c;它可以让你在上面任意构建草图、框线图、流程图以及产品模型&#xff0c;还能够注释一些重要地方&#xff0c;axure rp汉化版可支持同时多人写作设计和版本管理控制&#xff0c;这款交互式原型设计工具可以帮助设计者制作出高…

playbook变量的使用(二)

接上一章&#xff1a; 内置变量 变量的过滤器 31.9 内置变量hostvars hostvars用来显示指定主机的 fact变量,用法如下。 1 hostvars[ 主机名 ].键值 此变量一般用于&#xff0c;当某个play的 hosts 中只写了A主机组&#xff0c;但是同时想在此play中显示B 主机组中的信息,这…

Gradle中 Implementation 与API 声明依赖方式的对比

在Gradle中&#xff0c;implementation和api是声明依赖的两种方式&#xff0c;它们在如何暴露依赖关系方面有所不同&#xff1a; Implementation: 当一个模块使用implementation声明依赖时&#xff0c;该依赖仅对声明它的模块可见。这意味着该依赖对于该模块的消费者是隐藏的。…

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#…

如何通过ssh管道传输文件到ubuntu

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 如何在window系统中&#xff0c;通过ssh将指定的文件传输到ubuntu中呢&#xff1f; 比较常用的有以下种方式&#xff1a; 共享文件夹借助工具&#xff0c; FileZillaMobaxtermWinSCPXshell XFTP samba互传PuTTY pscp 今天主要…

【Mode Management】CanSM详细介绍

1. Introduction and functional overview AUTOSAR BSW栈为每个通信总线指定一个总线特定的状态管理器。CANSM实现CAN总线的数据流控制。CanSM隶属于通信服务层。CanSM和通信硬件抽象层以及系统服务层交互。 CanSM只用用于控制CAN通信。CanSM的任务就是操作CanIf模块去控制一个…

Python中abstractmethod的使用教程

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;抽象类和抽象方法提供了一种强制子类实现特定方法的机制。abstractmethod是abc&#xff08;Abstract Base Classes&#xff09;模块中的一部分&#xff0c;它允许定义抽象方法&#xff0c…

阿赵UE学习笔记——3、常用界面窗口

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。继续学习虚幻引擎&#xff0c;这次介绍的是编辑器的常用界面窗口。 一、视口 这个视口的概念&#xff0c;可以体现出UE对于多屏幕同时显示是多么的友好。我们开发游戏的时候&#xff0c;一般都会同一台电脑用2个或者以上显示器…

Docker的安装和使用

目录 安装Docker 安装yum工具 更新本地镜像源 安装docker 启动docker 关闭防火墙 docker启动命令 配置镜像加速 docker的使用 拉取nginx 查看本地镜像 把镜像文件nginx导出成tar文件 查看是否导出成功 ​编辑 删除本地镜像nginx:latest 导入镜像文件nginx 拉取…

算法基础之快速幂求逆元

快速幂求逆元 核心思想&#xff1a; 逆元&#xff1a; 逆元 ap-2 mod p #include<iostream>#include<algorithm>using namespace std;typedef long long LL;LL pmi(int a,int b,int c){LL res 1;while(b){if(b & 1) res res * a %c;b >> 1;a (LL)…

java定义三套场景接口方案

一、背景 在前后端分离开发的背景下&#xff0c;后端java开发人员现在只需要编写接口接口。特别是使用微服务开发的接口。resful风格接口。那么一般后端接口被调用有下面三种场景。一、不需要用户登录的接口调用&#xff0c;第二、后端管理系统接口调用&#xff08;需要账号密…

基于vue与three.js,监听FPX(Stats类使用)

第一步&#xff0c;引入stats类并new出来 import Stats from three/examples/jsm/libs/stats.module.js; data(){return {stats : new Stats(),} } 第二步&#xff0c;添加dom mounted() {this.init3D();this.animate();window.addEventListener("keydown", this.…

Android 自动化测试——Monkey测试

Android自带了很多方便的测试工具和方法&#xff0c;包括我们常用的单元测试、Robotium测试、Monkey测试、MonkeyRunner测试、senevent模拟等。这些方法对于我们编写高质量的APP十分有用。也可以提前暴露我们程序的隐藏问题。今天给大家讲一下Monkey测试&#xff0c;Monkey测试…

Java中的时间日期类⭐️通过具体案例分析下开发中常用到的几种时间日期格式类的使用

小伙伴们大家好&#xff0c;系统中不少模块都要用到时间日期&#xff0c;来分析总结下项目中用到的些日期类 目录 一、时间日期类 1.java.util.Calendar&#xff1a; 2.java.util.Date&#xff1a; 3.java.time.LocalDate、java.time.LocalTime、java.time.LocalDateTime&…

[Encryptedd@mailfence.com].faust 勒索病毒肆虐:如何恢复被加密的数据文件?

导言&#xff1a; 在网络安全的战场上&#xff0c;[backupsairmail.cc].faust [Deciphermailfence.com].faust[Encrypteddmailfence.com].faust[support2022cock.li].faust [tsai.shenmailfence.com].faust勒索病毒是一种极具破坏性的恶意软件。本文91数据恢复将深入介绍该病毒…