学习IO的时候,我们都曾经利用文件IO函数,标准IO函数都实现了对文件的拷贝,

对某一个文件进行拷贝时,我们可以考虑一下几种方式:

a.单进程拷贝:

假设某一文件需要拷贝100字节,每一个时间片可以完成拷贝20个字节工作量,则需要被分配5个时间片才可以完成任务,但问题是这些个时间片并不是被连续分配的,我们并不知道

到经过多少时间片才会有下一个能分配给该进程的时间片,为了解决这个问题,我们有了第二种方法。

b.多进程拷贝(单核单CPU):

通过切换进程,随着进程数的增加,当前程序获得时间片所需要的时间也就更少。

c.多进程拷贝(多核并发处理)

我们要实现的是第二个方法,代码如下:

 #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/wait.h>
int cutting(char *src,int prono)
{
int fd,filesize;
if((fd=open(src,O_RDONLY))==-)
{
perror("cutting open failed");
return -;
}
if((filesize=lseek(fd,,SEEK_END))==-)
{
perror("filesize failed");
close(fd);
return -;
}
int blocksize;
if(filesize%prono==)
{
blocksize=filesize/prono;
}
else
{
blocksize=filesize/prono+;
}
close(fd);
//printf("%d",blocksize);
return blocksize; }
int copy(char *src,char *des,int pos,int blocksize)
{
if(access(src,F_OK)==-)
{
perror("acess failed");
}
int fd1,fd2;
char buf[blocksize];
fd1=open(src,O_RDONLY);
fd2=open(des,O_WRONLY|O_CREAT,);
lseek(fd1,pos,SEEK_SET);
lseek(fd2,pos,SEEK_SET); int len=read(fd1,buf,sizeof(buf));
write(fd2,buf,len);
close(fd1);
close(fd2);
return ;
}
int create(char *src,char *des,int blocksize,int prono)
{
int i;
pid_t pid;
int pos=;
for(i=;i<prono;i++)
{
pid=fork();
if(pid>)
{
pos+=blocksize; //printf("当前读取位置为:%d,每次所读文件大小:%d,当前进程为%d\n",pos,blocksize,getpid()); } else if(pid==)
{
copy(src,des,pos,blocksize); printf("当前读取位置为:%d,每次所读文件大小:%d,当前进程为%d\n",pos,blocksize,getpid());
break;
} }
return ;
}
int main(int argc,char **argv)
{
int prono;
int blocksize;
if(argc<)
{
printf("the canshu you have chuan are too less\n");
}
if(argv[]!=)
{
prono=atoi(argv[]);
if(prono<=||prono>=)
{
printf("the num of the process you give cant not less than 0 or more than 100\n");
} }
else prono=;
blocksize=cutting (argv[],prono);
create(argv[],argv[],blocksize,prono); return ;
}

linux--多进程进行文件拷贝的更多相关文章

  1. linux下多进程的文件拷贝与进程相关的一些基础知识

    之前实现了用文件IO的方式能够实现文件的拷贝,那么对于进程而言,我们是否也能够实现呢? 答案是肯定的. 进程资源: 首先我们先回想一下,进程的执行须要哪些资源呢?其资源包含CPU资源,内存资源,当然还 ...

  2. linux常用命令---文件拷贝与传输

    拷贝命令 文件传输

  3. linux把某个文件拷贝到不同的目录下面

    find -name '7*' -type d|xargs -n 1 cp PBClassname.properties

  4. 用rz,sz命令在windows和linux之间传输文件(转)

    转自http://www.linuxmine.com/178.html有很多人没有听说过ZModem协议,更不知道有rz/sz这样方便的工具: 下面一段是从SecureCRT的帮助中copy的: ZM ...

  5. Linux系统下远程文件拷贝scp命令

    在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...

  6. Linux下不同机器之间的文件拷贝

    通过 scp 命令实现不同机器之间的文件拷贝. (1)本机考到目标机器:scp 本机文件 目的地: 如:scp /home/odp-web.war   root@192.168.6.137:/usr/ ...

  7. 使用pscp实现Windows 和 Linux服务器间远程拷贝文件

    转自:http://www.linuxidc.com/Linux/2012-05/60966.htm 在工作中,每次部署应用时都需要从本机Windows服务器拷贝文件到Linux上,有时还将Linux ...

  8. 在Linux系统中如何把文件拷贝到U盘

    Linux下把所有的都当成文件处理,如果在linux系统下需要拷贝文件,哪么你需要先把U盘挂载到系统中的某一个位置,然后再使用cp命令完成拷贝.   工具/原料 Linux操作系统一台 U盘一枚 方法 ...

  9. linux服务器间文件夹拷贝

    要求,在A机器执行脚本,把A机器的某个目录文件拷贝到B机器. 第一版ftp实现: 1.A 机器先安装 ftp 客户端 $ sudo yum install ftp 2.B机器安装ftp服务端 $ su ...

  10. 【原创】Linux基础之linux服务器服务器间拷贝文件

    linux服务器服务器间拷贝文件,有几种方式: 1 如果是定时任务,可以用rsync 2 如果是基于ssh登录,可以用scp,优点是可以实现远程到远程的拷贝,缺点是需要账号密码 upload: scp ...

随机推荐

  1. checkbox的readonly不起作用的解决方案

    checkbox的readonly不起作用的解决方案 <input type="checkbox" readonly /> checkbox没有readOnly属性,r ...

  2. 代码静态扫描工具sonar

    一.SonarQube整体介绍 SonarQube为静态代码检查工具,采用B/S架构,帮助检查代码缺陷,改善代码质量,提高开发速度,通过插件形式,可以支持Java.C.C++.JavaScripe等等 ...

  3. 通过Jenkins + Docker实现antdPro自动化推送私服、自动容器化部署功能

    Docker与Docker私服 1. 安装docker https://docs.docker.com/install/ 2. 配置docker镜像加速 https://www.daocloud.io ...

  4. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  5. Python入门之软件开发目录规范

    本章重点: 理解在开发人标准软件时,如何布局项目目录结构,以及注意开发规范的重要性. 一.为什么要有好的目录结构 二.目录组织的方式 三.关于README的内容 四.关于requirements.tx ...

  6. html判断当前页面是否在iframe中/顶级document中

    在使用div+iframe布局的应用中,通常我们希望在session超时或者未登录访问时跳转到登录页面,默认情况下iframe中的页面无法直接覆盖父页面,因此需要在登录页面加载的时候判断一下当前是否为 ...

  7. assert_param

    在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用.如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义 ...

  8. android 通过webview调起支付宝app支付

    网站学习:http://blog.csdn.net/zhuyu19911016520/article/details/71763900

  9. linux 安装MySql 5.7.20

    1.下载文件(https://pan.baidu.com/s/1c1VBcHy)放到目录:/usr/local/ 2.解压 cd /usr/local/ tar -zxvf mysql-5.7.20- ...

  10. 谈谈java中的final关键字

    知识点:final(最终的)关键字修饰类.方法.属性 1.final修饰类:那么这个就无法被继承,如String类.StringBuffer类.System类 2.final修饰方法:被修饰的方法不能 ...