使用父子进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,两个进程同时进行
#include<myhead.h>//获取拷贝文件的字节数
int get_file_len(const char* file1,const char* file2)
{//以只读形式打开需要读取的文件int fd1 = open(file1,O_RDONLY);//判断文件是否打开成功if(fd1==-1){perror("open error");return -1;}//创建需要写入的文件int fd2 = open(file2,O_WRONLY|O_TRUNC|O_CREAT,0664);if(fd2==-1){perror("open error");return -1;}//将光标定位到文件末尾获取文件字节数int len = lseek(fd1,0,SEEK_END);//关闭文件close(fd1);close(fd2);//返回字节数return len;
}//定义拷贝文件的函数
int copy_file(const char* file1,const char* file2,int start,int len)
{//以只读形式打开文件int fd1 = open(file1,O_RDONLY);//判断文件是否打开成功if(fd1==-1){perror("open error");return -1;}以只写形式打开文件int fd2=open(file2,O_WRONLY);//将光标偏移到需要读取和写入的位置lseek(fd1,start,SEEK_SET);lseek(fd2,start,SEEK_SET);//定义字符数组存储读取到的数据char buf[100]="";//计算读取到的字节数int sum=0;while(1){//清空数组bzero(buf,sizeof(buf));//获取读取到的字节数int res = read(fd1,buf,sizeof(buf));//计算字节数的和sum += res;//将最后一次读取到的数据写入文件if(res==0||sum>=len){write(fd2,buf,res-(sum-len));break;}//读取到多少字节就写入多少字节write(fd2,buf,res);}//关闭文件close(fd1);close(fd2);
}typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;int main(int argc, const char *argv[])
{//当外部参数不足时提示if(argc != 3){printf("文件参数不足\n");return -1;}//函数调用获取源文件字节数int len=get_file_len(argv[1],argv[2]);//创建子进程pid_t pid;pid=fork();//父进程执行的内容if(pid>0){//获取父进程进程号printf("父进程进程号为:%d\n",getpid());//函数调用将前一半字节拷贝进目标文件中copy_file(argv[1],argv[2],0,len/2);}//子进程执行内容else if(pid==0){//获取子进程进程号printf("子进程进程号为:%d\n",getpid());//将后一半字节拷贝进目标文件copy_file(argv[1],argv[2],len/2,len-len/2);//结束子进程exit(0);}//阻塞等待子进程结束wait(NULL);printf("拷贝成功\n");return 0;
}
思维导图: