多进程文件拷贝

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

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 源文件 目标文件”进行检查。
原文地址:https://www.cnblogs.com/pengdonglin137/p/2944998.html