Linux_fileio实现copy文件

参考韦东山老师教程:https://www.bilibili.com/video/BV1kk4y117Tu?p=12

目录

    • 1. 通过read方式copy文件
    • 2. 通过mmap映射方式copy文件

1. 通过read方式copy文件

copy文件代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>/** ./copy 1.txt 2.txt* argc    = 3* argv[0] = "./copy"* argv[1] = "1.txt"* argv[2] = "2.txt"*/
int main(int argc, char **argv)
{int fd_old, fd_new;char buf[1024];int len;/* 1. 判断参数 */if (argc != 3) {printf("Usage: %s <old-file> <new-file>\n", argv[0]);return -1;}/* 2. 打开老文件 */fd_old = open(argv[1], O_RDONLY);if (fd_old == -1){printf("can not open file %s\n", argv[1]);return -1;}/* 3. 创建新文件 */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;}/* 4. 循环: 读老文件-写新文件 */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;}}/* 5. 关闭文件 */close(fd_old);close(fd_new);return 0;
}

上传到Ubuntu后编译运行:

在这里插入图片描述

2. 通过mmap映射方式copy文件

mmap映射方式copy文件代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>/** ./copy 1.txt 2.txt* argc    = 3* argv[0] = "./copy"* argv[1] = "1.txt"* argv[2] = "2.txt"*/
int main(int argc, char **argv)
{int fd_old, fd_new;struct stat stat;char *buf;/* 1. 判断参数 */if (argc != 3) {printf("Usage: %s <old-file> <new-file>\n", argv[0]);return -1;}/* 2. 打开老文件 */fd_old = open(argv[1], O_RDONLY);if (fd_old == -1){printf("can not open file %s\n", argv[1]);return -1;}/* 3. 确定老文件的大小 */if (fstat(fd_old, &stat) == -1){printf("can not get stat of file %s\n", argv[1]);return -1;}/* 4. 映射老文件 */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;}/* 5. 创建新文件 */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;}/* 6. 写新文件 */if (write(fd_new, buf, stat.st_size) != stat.st_size){printf("can not write %s\n", argv[2]);return -1;}/* 5. 关闭文件 */close(fd_old);close(fd_new);return 0;
}

上传到Ubuntu后编译运行:

在这里插入图片描述

fstat函数使用方法:

fstat函数用于获取一个已经打开的文件的状态信息。它通常在编程语言中用于文件操作。

函数原型参数返回值
#include <sys/stat.h>
int fstat(int filedes, struct stat *buf);
filedes:这是文件描述符,通常通过open或fileno函数获得。
buf:是一个指向struct stat结构体的指针,用于存放文件的状态信息。
struct stat结构体包含了文件的各种信息,例如:

st_dev:设备ID。
st_ino:inode号。
st_mode:文件类型和权限位。
st_nlink:硬链接数量。
st_uid:文件拥有者的用户ID。
st_gid:文件拥有者的组ID。
st_rdev:如果是设备文件,则包含设备ID。
st_size:文件大小,以字节为单位。
st_atime、st_mtime、st_ctime:分别是最后一次访问、修改和状态变化的时间。
调用成功返回0,调用失败返回-1,并且会设置全局变量errno来表示具体的错误原因

在这里插入图片描述

在这里插入图片描述

mmap函数使用方法:

mmap函数是Unix和类Unix操作系统(包括Linux)中用于内存映射文件或设备的一种系统调用。它允许应用程序将一个文件或者其它对象映射到进程的地址空间,使得对这段内存区域的访问就像访问一个普通数组一样简单,同时又保留了文件的持久性。

函数原型参数返回值
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);addr:期望映射到的起始地址,通常设置为NULL以让系统选择一个合适的地址。
length:映射的字节数。
prot:指定映射区域的保护标志,可以是以下值的组合:
PROT_READ:映射区域可读。
PROT_WRITE:映射区域可写。
PROT_EXEC:映射区域可执行。
PROT_NONE:映射区域不可访问。
flags:映射的类型和特性标志,常见标志包括:
MAP_SHARED:多个进程可以共享映射区域,对映射区域的写操作会被写回原文件。
MAP_PRIVATE:创建私有副本,写操作不会影响原文件,会产生一份副本(写时复制)。
MAP_FIXED:强制映射到addr指定的地址,如果该地址已被使用,则会触发SIGBUS信号。
MAP_ANONYMOUS 或 MAP_ANON:映射匿名内存,不与任何文件关联。
fd:文件描述符,指定要映射的文件或设备。
offset:文件中的起始偏移量,单位是字节。
mmap成功时返回映射区域的起始地址,失败时返回MAP_FAILED(通常被定义为(void *) -1),此时可以通过errno变量检查具体的错误原因。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Python知识点背诵手册,超详细知识梳理

一、手册介绍 《Python知识点背诵手册》是一份详尽的Python学习资料&#xff0c;旨在帮助学习者系统地掌握Python语言的基础知识和进阶技能。该手册将Python的所有关键语法和概念进行了精炼的总结&#xff0c;并以易于理解和记忆的方式呈现。以下是手册的主要特点和内容概述&a…

Kafka-时间轮和延迟操作-源码流程

TimingWheel 字段&#xff1a; buckets&#xff1a;Array.tabulate[TimerTaskList]类型&#xff0c;其每一个项都对应时间轮中的一个时间格&#xff0c;用于保存 TimerTaskList的数组。在TimingWheel中&#xff0c;同一个TimerTaskList中的不同定时任务的到期时间可能 不同&a…

YOLO-world论文阅读笔记

论文&#xff1a;https://arxiv.org/abs/2401.17270 code: https://github.com/AILab-CVC/YOLO-World 1、为什么要做这个研究&#xff08;理论走向和目前缺陷&#xff09; ? 之前的开集检测器大多比较慢&#xff0c;不利于部署。 2、他们怎么做这个研究 &#xff08;方法&…

【鸿蒙学习笔记】基础组件Blank:空白填充组件

Blank&#xff1a;空白填充组件 Column({ space: 20 }) {Row() {Text(Bluetooth)Blank().color(Color.Yellow)Toggle({ type: ToggleType.Switch }).margin({ top: 14, bottom: 14, left: 6, right: 6 })}.backgroundColor(Color.Pink).borderRadius(15).padding({ left: 12 }…

数组-长度最小的子数组

M长度最小的子数组&#xff08;leetcode209&#xff09; /*** param {number} target* param {number[]} nums* return {number}*/ var minSubArrayLen function(target, nums) {const n nums.length;let ans n 1;let sum 0; // 子数组元素和let left 0; // 子数组…

2024 MWC上海:创新力量驱动未来先行,移远智慧点亮数字蓝海

6月26日&#xff0c;2024年世界移动通信大会&#xff08;MWC上海&#xff09;如期举行&#xff0c;今年的展会以“未来先行”为主题&#xff0c;涵盖“超越 5G、数智制造和人工智能经济”三大技术主题。移远通信作为全球物联网行业的引领者之一&#xff0c;今年不仅在展示内容上…

终极指南:RNNS、Transformers 和 Diffusion 模型

一、说明 作为广泛使用这些工具和模型的人&#xff0c;我的目标是解开 RNN、Transformer 和 Diffusion 模型的复杂性和细微差别&#xff0c;为您提供详细的比较&#xff0c;为您的特定需求提供正确的选择。 无论您是在构建语言翻译系统、生成高保真图像&#xff0c;还是处理时间…

RK3568平台(USB篇)USB HID设备

一.USB HID设备简介 USB HID设备主要用于和计算机进行交互通信&#xff0c;典型的USB HID类设备包括USB键盘、USB鼠标、USB游戏手柄等等&#xff0c;这些都是日常生活中常见的设备。以USB接口的鼠标为例&#xff0c;打开计算机的“设备管理器”&#xff0c;可以在“鼠标和其他…

C++ ariac2 Windows库编译

cd "F:\\aria2" gmp-6.1.2.tar.lz expat-2.2.0.tar.bz2 sqlite-autoconf-3160200.tar.gz zlib-1.2.11.tar.gz c-ares-1.12.0.tar.gz libssh2-1.8.0.tar.gz --enable-libaria2 --enable-static libgnutls-dev&#xff08;对于HTTPS&#xff0c;BitTorrent&#xff0…

【Redis7】零基础篇

1 课程概述 2 Redis入门概述 2.1 是什么 Redis是基于内存的KV键值对内存数据库 Redis&#xff1a;Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c…

阿里Nacos下载、安装(保姆篇)

文章目录 Nacos下载版本选择Nacos安装Windows常见问题解决 更多相关内容可查看 Nacos下载 Nacos官方下载地址&#xff1a;https://github.com/alibaba/nacos/releases 码云拉取&#xff08;如果国外较慢或者拉取超时可以试一下国内地址&#xff09; //国外 git clone https:…

ssh网关-sshpiper

1、环境 操作系统&#xff1a;龙蜥os 7.9 sshpiper&#xff1a;1.3.1 2、下载软件 https://github.com/tg123/sshpiper/releases 3、解压到指定目录 mkdir /opt/sshpiper tar -xvf sshpiperd_with_plugins_linux_x86_64.tar.gz -C /opt/sshpipe4、添加执行权限 chmod x /o…

[开源软件] 支持链接汇总

“Common rules: 1- If the repo is on github, the support/bug link is also on the github with issues”" label; 2- Could ask questions by email list;" 3rd party software support link Note gcc https://gcc.gnu.org openssh https://bugzilla.mindrot.o…

《昇思25天学习打卡营第9天|onereal》

继续学习昨天的 基于MindNLPMusicGen生成自己的个性化音乐 生成音乐 MusicGen支持两种生成模式&#xff1a;贪心&#xff08;greedy&#xff09;和采样&#xff08;sampling&#xff09;。在实际执行过程中&#xff0c;采样模式得到的结果要显著优于贪心模式。因此我们默认启…

K6 性能测试教程:入门介绍,环境搭建和编写第一个 K6 测试脚本

K6 性能测试教程&#xff1a;入门介绍&#xff0c;环境搭建和编写第一个 K6 测试脚本 这篇文章将带您进入 K6 性能测试的世界。博文内容涵盖了 K6 性能测试的入门知识、环境搭建步骤&#xff0c;以及如何编写您的第一个测试脚本。无论您是初学者还是有经验的性能测试专业人员&…

详解C语言分支与循环语句

分支语句 if elseswitch 循环语句 whilefordo while goto语句 文章目录 1.什么是语句2.分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.3 练习 2.2 switch语句2.2.1 在switch语句中的break2.2.2 default子句 3.循环语句3.1 while循环3.1.1 while语句中…

【Linux进程通信】使用匿名管道制作一个简单的进程池

进程池是什么呢&#xff1f;我们可以类比内存池的概念来理解进程池。 内存池 内存池是在真正使用内存之前&#xff0c;先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c;若内存块不够再继…

web权限到系统权限 内网学习第一天 权限提升 使用手工还是cs???msf可以不??

现在开始学习内网的相关的知识了&#xff0c;我们在拿下web权限过后&#xff0c;我们要看自己拿下的是什么权限&#xff0c;可能是普通的用户权限&#xff0c;这个连添加用户都不可以&#xff0c;这个时候我们就要进行权限提升操作了。 权限提升这点与我们后门进行内网渗透是乘…

MySQL:设计数据库与操作

设计数据库 1. 数据建模1.1 概念模型1.2 逻辑模型1.3 实体模型主键外键外键约束 2. 标准化2.1 第一范式2.2 链接表2.3 第二范式2.4 第三范式 3. 数据库模型修改3.1 模型的正向工程3.2 同步数据库模型3.3 模型的逆向工程3.4 实际应用建议 4. 数据库实体模型4.1 创建和删除数据库…

Linux 磁盘空间清理

1.检查磁盘使用情况 #显示每个挂载点的磁盘使用量&#xff0c;以及可用空间和使用率 df -h #显示当前目录的全部文件和目录&#xff08;包括隐藏的&#xff09;,以MB显示 ll -h 2. du查看最大的目录或文件 #逐级检查某个目录下各个子目录的大小。从根目录开始&#xff0c;逐级…