Linux下快速拷贝单个大文件的秘诀
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/wait.h>
void err_int(int ret, const char *err)
{
if (ret == -1) {
perror(err);
exit(1);
}
return ;
}
void err_str(char *ret, const char *err)
{
if (ret == MAP_FAILED) {
perror(err);
exit(1);
}
}
int main(int argc, char *argv[])
{
int fd_src, fd_dst, ret, len, i, n;
char *mp_src, *mp_dst, *tmp_srcp, *tmp_dstp;
pid_t pid;
struct stat sbuf;
if (argc < 3 || argc > 4) {
printf("使用方法: ./script src_file dest_file\n");
printf("例子: ./copy a.file /vdb/a.file\n");
exit(1);
} else if (argc == 3) {
n = 5;
} else if (argc == 4) {
n = atoi(argv[3]);
}
fd_src = open(argv[1], O_RDONLY);
err_int(fd_src, "open dict.txt err");
fd_dst = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0664);
err_int(fd_dst, "open dict.cp err");
ret = fstat(fd_src, &sbuf);
err_int(ret, "fstat err");
len = sbuf.st_size;
if (len < n)
n = len;
ret = ftruncate(fd_dst, len);
err_int(ret, "truncate fd_dst err");
mp_src = (char *)mmap(NULL, len, PROT_READ, MAP_SHARED, fd_src, 0);
err_str(mp_src, "mmap src err");
mp_dst = (char *)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd_dst, 0);
err_str(mp_dst, "mmap dst err");
tmp_dstp = mp_dst;
tmp_srcp = mp_src;
int bs = len / n;
int mod = len % bs;
for (i = 0; i < n; i++) {
if ((pid = fork()) == 0) {
break;
}
}
if (n == i) {
for (i = 0; i < n; i++)
wait(NULL);
} else if (i == (n-1)){
memcpy(tmp_dstp+i*bs, tmp_srcp+i*bs, bs+mod);
} else if (i == 0) {
memcpy(tmp_dstp, tmp_srcp, bs);
} else {
memcpy(tmp_dstp+i*bs, tmp_srcp+i*bs, bs);
}
munmap(mp_src, len);
munmap(mp_dst, len);
return 0;
}
将上面文件保存为copy.c,使用方法:
gcc copy.c -o copy
./copy src_file dest/src_file
Linux下快速拷贝单个大文件的秘诀的更多相关文章
- 【转】linux 下清空或删除大文件的一些方法
原文:https://linux.cn/article-8024-1.html 在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何 Linux 命令行编辑器 去打开这些文件 ...
- Linux下迅速删除一个大文件夹
rsync -av --delete /tmp/null/ ./ 迅速删除大文件夹,如缓存 快速删除大目录(即大量文件)1.先建立一个空目录 mkdir /data/blank 2.用r ...
- Linux下清空或删除大文件内容的2种方法
在Linux终端下处理文件时,有时候我们想要直接清空文件的内容时但又不用使用任何Linux命令行编辑器,去打开这些文件.那如何才能达到这个目的呢? 1.通过重定向到NULL来清空文件内容 清空或者让一 ...
- Linux下快速手动产生core文件
原文链接:https://blog.csdn.net/jctian000/article/details/79695006 当我们配置好自动生成core文件的环境后,若不想写导致崩溃的程序验证,那要怎 ...
- Linux 下清空或删除大文件内容的 5 种方法
在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何 Linux 命令行编辑器 去打开这些文件.那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清空 ...
- Linux下快速删除大量小文件引起的磁盘inode(目录索引)过满
1)首先建立一个空白文件夹. mkdir /tmp/empty 然后安装下rsync yum install -y rsync 2)之后使用以下语句即可快速的删除文件. rsync --delete- ...
- Linux 删除文件未释放空间问题处理,下清空或删除大文件
linux里的文件被删除后,空间没有被释放是因为在Linux系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么 ...
- 【转】Linux 中清空或删除大文件内容的五种方法(truncate 命令清空文件)
原文: http://www.jb51.net/article/100462.htm truncate -s 0 access.log -------------------------------- ...
- Linux系统中如何查找大文件或文件夹的方法
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...
随机推荐
- CF736D Permutations(伴随矩阵)
CF736D Permutations(伴随矩阵) Luogu 题解时间 首先把边直接放进邻接矩阵, 很明显行列式的奇偶和方案数的奇偶一样. 设 $ A_{ i , j } $ 为矩阵的该行列的余子式 ...
- 关于“TypeError: Assignment to constant variable”的问题解决方案
在项目开发过程中,在使用变量声明时,如果不注意,可能会造成类型错误比如: Uncaught (in promise) TypeError: Assignment to constant variabl ...
- 为什么Java中 wait 方法需要在 synchronized 的方法中调用?
另一个棘手的核心 Java 问题,wait 和 notify.它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 modify 需要监视对其上 ...
- memcached 是如何做身份验证的?
没有身份认证机制!memcached 是运行在应用下层的软件(身份验证应该是应用 上层的职责).memcached 的客户端和服务器端之所以是轻量级的,部分原因就 是完全没有实现身份验证机制.这样,m ...
- 爬虫-数据解析-xpath
xpath 解析 模块安装 : pip install lxml xpath的解析原理 实例化一个etree类型的对象,且将页面源码数据加载到该对象中 需要调用该对象的xpath方法结合着不同形式的x ...
- java中如何获得src路径
代码 解析: 类名.class.get类加载器().getResourceAsStream("文件名"); 案例代码: Demo.class.getClassLoader().ge ...
- Flutter入门教程(四)第一个flutter项目解析
一.创建一个Flutter工程 1.1 命令行创建 首先我们找一个空目录用来专门存放flutter项目,然后在路径中直接输入cmd: 使用 flutter create <projectname ...
- 用CSS实现Tab页切换效果
用CSS实现Tab切换效果 最近切一个页面的时候涉及到了一个tab切换的部分,因为不想用js想着能不能用纯CSS的选择器来实现切换效果.搜了一下大致有下面三种写法. 利用:hover选择器 缺点:只有 ...
- 软件构造实验-百度图像识别api
识别结果: 识别结果:
- java中如何创建自定义异常Create Custom Exception
9.创建自定义异常 Create Custom Exception 马克-to-win:我们可以创建自己的异常:checked或unchecked异常都可以, 规则如前面我们所介绍,反正如果是chec ...