之前实现了用文件IO的方式能够实现文件的拷贝,那么对于进程而言,我们是否也能够实现呢?

答案是肯定的。

进程资源:

首先我们先回想一下,进程的执行须要哪些资源呢?其资源包含CPU资源,内存资源,当然还有时间片资源。我们都知道进程是有 栈。 堆,  仅仅读数据段,  数据段(已初始化的全局变量静态变量),bss段(未初始化的),
  代码段另一组寄存器值。

进程命令:

另外我们也能够通过 ps  -ef |grep 进程名命令来查看进程号(PID)和父进程号(PPID),之后还能够通过  

ps aux |grep 进程名或进程号来查看进程的状态(R,T,S,Z,(+)...).通过 kill -信号的序号或宏  PID来对信号发各种信号。注意这里面的kill可不是杀死进程的意思。我们能够通过给进程发信号来杀死进程kill
-SIGKILL PID  ,当然我们能够通过 kill -l 来获取宏名,其次我们通过nice 或renice来给我们的进程设置
不同的优先级,等等等等。

进程创建:

我们会用fork函数来创建进程,曾经我们都非常清除的知道,一个函数仅仅能够返回一个返回值。那么进程创建的函数也仅仅返回一个么?答案是不正确的,由于通过fork函数创建的进程,假设成功的话我们向父进程返回子进程的PID号,向子进程返回0,假设创建失败,则向父进程返回-1。

创建完子进程后。父进程从fork()的下一条语句開始运行,子进程也是从下一条语句运行么?

是的,由于创建子进程的时候拷贝父进程的pc寄存器值,而pc寄存器的值决定了你的进程是从什么地方開始的。所以当创建完子进程后,我们的子进程的运行与父进程的运行系一样的方式,可是注意他们两个不是一块进行的。也有先后关系,仅仅是先后关系不确定,假设用vfork函数创建进程的话,那么我们的子进程是先进行的。

那么上面说了fork()函数与vfork()函数都能够创建进程,有什么差别呢?

<1>fork创建子进程后。父子进程运行的顺序是不确定的,父子进程的地址空间是独立的。

<2>vfork创建完子进程后,保证子进先运行,父进程在子进程结束。或调用exec函数族后才開始运行。

而且父子进程共享同一地址空间【假设子进程调用了exec函数则子进程会独立出来】。

那么如何利用进程来进行文件的拷贝呢?以及如何拷贝呢?详细实现的要求例如以下,父进程复制文件的前一半子进程复制文件的后一半,那么效率上面我们肯定比一个进程高得多了。以上就是对进程知识的相关回想。知识点有了,思路有了。那么剩下的就仅仅是代码实现的问题了。也就是体力劳动了:

请看以下代码的实现:

#include <head.h>

int child_copy(int fd_src,int fd_dest,int file_size)
{
int ret;
int n;
char buf[1024];
ret = lseek(fd_src,file_size/2,SEEK_SET);
if(ret < 0)
{
perror("Fail to src_file lseek");
exit(EXIT_FAILURE);
}
ret = lseek(fd_dest,file_size/2,SEEK_SET);
if(ret < 0)
{
perror("Fail to dest_file lseek");
exit(EXIT_FAILURE);
}
while(1)
{
n = read(fd_src,buf,sizeof(buf));
if(n == 0)
break;
write(fd_dest,buf,n);
}
return 0;
}
int parent_copy(int fd_src,int fd_dest,int size)
{
int n;
int count = 0;
char buf[1024];
while(1)
{
// lseek(fd_src,0,SEEK_SET);
// lseek(fd_dest,0,SEEK_SET);
n = read(fd_src,buf,sizeof(buf));
write(fd_dest,buf,n);
count += n;
if(count >= size/2)
break;
}
return 0;
}
// ./a.out src_file dest_file
int main(int argc, const char *argv[])
{
pid_t pid;
int file_size; //the size of file
int fd_src,fd_dest;
struct stat f_info; if(argc < 3)
{
fprintf(stderr,"Usage :%s argv[1] argv[2]\n",argv[0]);
exit(EXIT_FAILURE);
}
if(stat(argv[1],&f_info) < 0)
{
fprintf(stderr,"Fail to stat %s: %s",argv[1],strerror(errno));
exit(EXIT_FAILURE);
}
file_size = f_info.st_size; //get the size of file fd_src = open(argv[1],O_RDONLY);//open the file
if(fd_src < 0)
{
fprintf(stderr,"Fail to open %s : %s\n",argv[1],strerror(errno));
exit(EXIT_FAILURE);
} fd_dest = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666);
if(fd_src < 0)
{
fprintf(stderr,"Fail to open %s : %s\n",argv[2],strerror(errno));
exit(EXIT_FAILURE);
} if(ftruncate(fd_dest,file_size) < 0) //create a empty file
{
perror("fail to ftruncate");
exit(EXIT_FAILURE);
} pid = fork();
if(pid < 0)
{
fprintf(stderr,"Fail to fork\n",strerror(errno));
exit(EXIT_FAILURE);
}
if(pid == 0)
{
close(fd_src);
close(fd_dest);
fd_src = open(argv[1],O_RDONLY);//open the file again
if(fd_src < 0)
{
fprintf(stderr,"Fail to open %s : %s\n",argv[1],strerror(errno));
exit(EXIT_FAILURE);
} fd_dest = open(argv[2],O_WRONLY);
if(fd_src < 0)
{
fprintf(stderr,"Fail to open %s : %s\n",argv[2],strerror(errno));
exit(EXIT_FAILURE);
} child_copy(fd_src,fd_dest,file_size);
}
if(pid > 0)
{
// getchar();
parent_copy(fd_src,fd_dest,file_size);
} return 0;
}

    



注:

本程序用到的头文件本人直接封装在了head.h中。假设有哪里须要改进希望留言给我哈





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

  1. Linux下如何知道文件被那个进程写

    http://blog.yufeng.info/archives/2581#more-2581

  2. Linux下几种文件传输命令

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

  3. Linux下重要日志文件及查看方式

    http://os.51cto.com/art/201108/282184_all.htm   1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的 ...

  4. linux下多进程的调试

    linux下多进程的调试:  (1)follow-fork-mode           set follow-fork-mode [parent | child] ---- fork之后选择调试父进 ...

  5. linux下执行.sh文件的方法和语法

    linux下执行.sh文件的方法    .sh文件就是文本文件,如果要执行,需要使用chmod a+x xxx.sh来给可执行权限.       是bash脚本么   可以用touch test.sh ...

  6. Linux下内存映射文件的用法简介

    由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流. 简介: 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区 ...

  7. linux 下各个头文件的作用[典]

    linux 下各个头文件的作用   2.6.30.4的头文件的位置和2.6.25.8的不一样,除去内核源码下的include目录外, 在arch/arm/mach-s3c2410/和arch/arm/ ...

  8. [转帖]Linux下主机间文件传输命令

    Linux下主机间文件传输命令 https://yq.aliyun.com/articles/53631?spm=a2c4e.11155435.0.0.580ce8ef4Q9uzs   SCP命令: ...

  9. 浅谈Linux下/etc/passwd文件

    浅谈Linux 下/etc/passwd文件 看过了很多渗透测试的文章,发现在很多文章中都会有/etc/passwd这个文件,那么,这个文件中到底有些什么内容呢?下面我们来详细的介绍一下. 在Linu ...

随机推荐

  1. HDU 2435 There is a war Dinic 最小割

    题意是有n座城市,n号城市不想让1号城市可达n号,每条道路有一条毁坏的代价,1号还可以修一条不能毁坏的道路,求n号城市所需的最小代价最大是多少. 毁坏的最小代价就直接求一遍最大流,就是最小割了.而可以 ...

  2. springmvc使用jQuery.datatable时遇到的错误

    springmvc使用jQuery.datatable时遇到的错误 1正确时返回 josn结果: {,,,,,,,,,,,,,,,,"} 页面显示处理中(processing),列表空白,其 ...

  3. 清空/var/adm/wtmp 文件内容

    清/var/adm/wtmp 文件内容 用于显示登录系统和重启机器的情况 /var/adm/wtmp文件过大. 可用du -sm /var/adm/wtmp查看 cat /dev/null>/v ...

  4. 请允许我成为你的夏季——shiro、jdbcInsertall

    这两天总是觉得自己被关进了一个大笼子,日子拮据.生活不就是这样吗,一边觉得自己很差劲,一边又想成为一个更好的自己.可那又有什么办法呢,万物皆有裂痕,但那又怎样,那是光照进来的地方啊. 开始学习shir ...

  5. 【Docker基本操作】

    关于镜像的操作 docker search centos 搜索所有centos的镜像 docker pull centos 获取centos镜像 docker images 或 docker imag ...

  6. 【RHEL7/CentOS7基本配置】

    目录 @ 相比于6.x的版本,Rhel7/CentOS7增加或改进了以下7大特性. 1.身份管理 kerberos的跨平台信任机制:kerberos将完全兼容微软活动目录,实现完全使用活动目录进行认证 ...

  7. 【Django】Web框架本质

    目录 根据不同的路径返回不同的内容 普通版 函数版 函数进阶版 返回具体的HTML文件 让网页动态起来 服务器和应用程序 wsgiref 模块 @ * 我们可以这样理解:所有的==Web应用本质上就是 ...

  8. Swift学习笔记(2)--元组(Tuples)、Optional(可选值)、(Assertions)断言

    1.Tuples(元组) 元组是多个值组合而成的复合值.元组中的值可以是任意类型,而且每一个元素的类型可以是不同的. 1>定义:使用()包含所有元素,用逗号分开,也可以对每个元素做命名 let ...

  9. UVALive 6869 Repeated Substrings

    Repeated Substrings Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Descri ...

  10. Python入门:全站url爬取

    <p>作为一个安全测试人员,面对一个大型网站的时候,手工测试很有可能测试不全,这时候就非常需要一个通用型的网站扫描器.当然能直接扫出漏洞的工具也有很多,但这样你只能算是一个工具使用者,对于 ...