• 多进程文件拷贝


    下面用程序实现这样的功能:有一个文件的内容需要拷贝到另一个文件中,以前的做法是用一个进程来完成,下面要做的是,是两个进程同时做这件事,一个进程负责一半,如父进程负责拷贝文件的前半段,子进程负责拷贝文件的后半段。下面看一下程序的流程以及需要注意的问题:

    image

    其中 要注意的是当父进程调用fork函数创建子进程后,子进程同样也把父进程所打开的文件描述符fd拷贝过来,但是,在内核当中的struct file结构体只有一份。即:

    image

    这不是我们期望的,这样会造成两个进程之间的干扰,比如文件的当前位置就不好控制。对于文件描述符符可以这么理解:

    在每个进程的进程控制块PCB当中有一个结构体指针数组 struct file *a[] = {0xa0,0xb0,……};子进程创建时,也拷贝了父进程的这个指针数组。每当一个进程p1调用open函数都返回一个整型的文件描述符fd,同时内核空间就会产生一个相应的struct file 类型的结构体,这个结构体的的地址就存放在该进程p1的PCB中的a[fd]中。而进程p1也是通过这个数组来找到相应的文件的,当进程p1执行close(fd)后,描述符a中的a[fd]不再保存相应的结构体的地址,注意:内核中那个结构体可能还存在,原因是虽然p1不再使用该文件,但是其父进程或者子进程还使用该文件,即只要有还指向该结构体的文件描述符存在,他就不会释放。还应该知道,同一个文件可以有多个struct file,即一个文件可以被打开多次,每次的fd可能不同,但是打开一次内核中就创建一个关于这个文件的struct file。

    所以,在子进程中应该先将源文件a和目标文件b关闭,然后再打开,这样就不会相互干扰了。

    即:

    image

    下面是程序:


    拷贝完成了后,用 “diff 源文件 目标文件”进行检查。
  • 相关阅读:
    CentOS7中使用yum安装Nginx的方法
    vsftp上传文件权限
    java传入ftp 0k
    centos 7.0 查看selinux状态|关闭|开启
    NamingException
    fastdfs服务器搭建
    安装gnome图形界面程序
    MAVEN插件-tomcat插件,java编译插件,资源文件拷贝插件
    spring ioc
    jsp全路径
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/2944998.html
Copyright © 2020-2023  润新知