linux--多进程进行文件拷贝

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

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

a.单进程拷贝:

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

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

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

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

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

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

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<fcntl.h>
  5 #include<string.h>
  6 #include<sys/types.h>
  7 #include<sys/stat.h>
  8 #include<sys/wait.h>
  9 int cutting(char *src,int prono)
 10 {
 11     int fd,filesize;
 12     if((fd=open(src,O_RDONLY))==-1)
 13     {
 14         perror("cutting open failed");
 15     return -1;
 16     }
 17     if((filesize=lseek(fd,0,SEEK_END))==-1)
 18     {
 19         perror("filesize failed");
 20         close(fd);
 21         return -1;
 22     }
 23     int blocksize;
 24     if(filesize%prono==0)
 25     {
 26         blocksize=filesize/prono;
 27     }
 28     else
 29     {
 30         blocksize=filesize/prono+1;
 31     }
 32     close(fd);
 33     //printf("%d",blocksize);
 34     return blocksize;
 35
 36 }
 37 int copy(char *src,char *des,int pos,int blocksize)
 38 {
 39     if(access(src,F_OK)==-1)
 40     {
 41         perror("acess failed");
 42     }
 43     int fd1,fd2;
 44     char buf[blocksize];
 45     fd1=open(src,O_RDONLY);
 46     fd2=open(des,O_WRONLY|O_CREAT,0664);
 47     lseek(fd1,pos,SEEK_SET);
 48     lseek(fd2,pos,SEEK_SET);
 49
 50
 51     int len=read(fd1,buf,sizeof(buf));
 52     write(fd2,buf,len);
 53     close(fd1);
 54     close(fd2);
 55     return 1;
 56 }
 57 int create(char *src,char *des,int blocksize,int prono)
 58 {
 59     int i;
 60     pid_t pid;
 61     int pos=0;
 62     for(i=0;i<prono;i++)
 63     {
 64         pid=fork();
 65         if(pid>0)
 66         {
 67             pos+=blocksize;
 68
 69             //printf("当前读取位置为:%d,每次所读文件大小:%d,当前进程为%d\n",pos,blocksize,getpid());
 70
 71     }
 72
 73         else if(pid==0)
 74         {
 75             copy(src,des,pos,blocksize);
 76
 77             printf("当前读取位置为:%d,每次所读文件大小:%d,当前进程为%d\n",pos,blocksize,getpid());
 78             break;
 79         }
 80
 81     }
 82     return 1;
 83 }
 84 int main(int argc,char **argv)
 85 {
 86     int prono;
 87     int blocksize;
 88     if(argc<3)
 89     {
 90         printf("the canshu you have chuan are too less\n");
 91     }
 92     if(argv[3]!=0)
 93     {
 94         prono=atoi(argv[3]);
 95         if(prono<=0||prono>=100)
 96         {
 97             printf("the num of the process you give cant not less than 0 or more than 100\n");
 98         }
 99
100     }
101     else prono=5;
102     blocksize=cutting (argv[1],prono);
103     create(argv[1],argv[2],blocksize,prono);
104
105     return 0;
106 }

时间: 2024-10-10 11:06:26

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

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

之前实现了用文件IO的方式可以实现文件的拷贝,那么对于进程而言,我们是否也可以实现呢? 答案是肯定的. 进程资源: 首先我们先回顾一下,进程的运行需要哪些资源呢?其资源包括CPU资源,内存资源,当然还有时间片资源,我们都知道进程是有 栈, 堆,  只读数据段,  数据段(已初始化的全局变量静态变量),bss段(未初始化的),   代码段还有一组寄存器值. 进程命令: 另外我们也可以通过 ps  -ef |grep 进程名命令来查看进程号(PID)和父进程号(PPID),之后还可以通过 ps au

LINUX SCP 远程 文件 拷贝

首先要确保两台机子直接IP能够互相ping通 然后使用SCP命令从第一台主机向第二台主机拷贝文件 scp src [email protected]:/home/chiwei/mydisk/buffer_scp_file ssh: connect to host 192.168.8.144 port 22: Connection refused lost connection 检查远程主机没有安装sshd [email protected]:~/mydisk/buffer_scp_file$ s

多进程和多线程文件拷贝

1. 线程与进程的异同点 A.相同点 1):  比如都有自己在系统中唯一标识ID,一组寄存器(pc指针),状态(6种),调度优先级以及所要遵循的调度策略. 2):  每个进程都有一个进程控制块,线程也拥有一个线程控制块(在Linux内核,线程控制块与进程控制块用同一个结         构体描述,即struct  task_struct),这个控制块包含线程的一些属性信息,操作系统使用这些属性信息来描述线             程. 3):  线程和子进程的创建者可以在线程和子进程上实行某些控

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

在工作中,每次部署应用时都需要从本机Windows服务器拷贝文件到Linux上,有时还将Linux 上的文件拷到本机,这些操作以前都是使用Ftp 工具FlashFxp 来操作的,最近就想有什么更快捷的方法没,比如直接命令操作.结合网上查询的资料,发现 pscp 能够实现Windows 和Linux 间相互传输文件.下文将详细描述如何使用: 一.pscp 简要描述: PSCP (PuTTY Secure Copy client)是PuTTY 提供的文件传输工具 ,通过 SSH 连接,在两台机器之间

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

通过 scp 命令实现不同机器之间的文件拷贝. (1)本机考到目标机器:scp 本机文件 目的地: 如:scp /home/odp-web.war   [email protected]:/usr/local/Tomcat/wepapps/ (2)其他机器考到本机:scp 其他机器上的文件 本机路径 如:scp [email protected]:/usr/local/Tomcat/wepapps/   /home/odp-web.war

linux下常用文件传输命令(转)

因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp,wget,curl. rcp rcp不是一种安全的的传输文件的方式,rcp通过rsh(rsh见下面)来执行远程命令,要使用rcp必须经过一些配置,现在rcp已经被scp取代了,常用scp来进行文件传输.要使用rcp,需要具备以下条件: (1)如果系统中有/etc/hosts 文件,应确保该文件包含要

小何讲Linux: 基本文件操作和实例

文件操作的基本概念参见博客: 小何讲Linux: 底层文件I/O操作 1.  函数说明 open()函数:是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数. 所谓打开文件实质上是在进程与文件之间建立起一种连接,而"文件描述符"唯一地标识着这样一个连接 close()函数:是用于关闭一个被打开的文件.当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件. read()函数:是用于将从指定的文件描述符中读出的数据

Linux下查看文件编码,文件编码格式转换和文件名编码转换

linux相关   2008-10-07 10:46   阅读1392   评论0   字号: 大大  中中  小小  如果你需要在Linux中 操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是 UTF-8.下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换. 查看文件编码 在Linux中查看文件编码可以通过以下几种方式: 1.在Vim中可以直接查看文件编码 :set file

linux系统下文件压缩与归档

不管是普通使用linux系统,还是做为一名运维人员,掌握文件的压缩与归档都是有必要的,在linux系统上压缩与归档的工具是比较多的,今天我就带大家了解一些比较常见的压缩与归档工具. 一.compress/uncompress  默认会删除原文件 compress [-dfvcVr] [-b maxbits] [file ...]  -d: 解压缩,相当于uncompress  -c: 结果输出至标准输出,不删除原文件  -v: 显示详情  uncompress 解压缩  zcat 不解压缩的前提

修改Linux下的文件以及文件夹的权限

如何在Linux中管理文件和文件夹的权限? 2014-02-12 10:58 布加迪编译 51CTO 字号:T | T Linux系统有严格的权限管理制度,操作者权限与文件权限不匹配时将无法对文件进行任何操作.对许多Linux用户来说,习惯于文件的权限和所有权可能有点难度.本文从命令行开始入手,教您在Linux中管理文件和文件夹权限的方法. AD:51CTO学院:IT精品课程在线看! [51CTO精选译文]对许多Linux用户来说,习惯于文件的权限和所有权可能有点难度.人们通常认为,想进入到这种