10.17 多进程编程
作业:使用父子进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,两个进程同时进行
代码实现:
#include <myhead.h>
void copy_file(const char *src,const char *dest,int start,int end){int fd_src=open(src,O_RDONLY);if(fd_src==-1){perror("open error");return ;}int fd_dest=open(dest,O_WRONLY);if(fd_dest==-1){perror("open error");return ;}lseek(fd_src,start,SEEK_SET);lseek(fd_dest,start,SEEK_SET);char buf[30];int sum=0;while(1){int res=read(fd_src,buf,sizeof(buf));sum+=res;if(sum>=end){write(fd_dest,buf,res-(sum-end));break;}write(fd_dest,buf,res);}close(fd_src);close(fd_dest);}
int get_len(const char *src,const char *dest){int fd_src=open(src,O_RDONLY);if(fd_src==-1){perror("open error");return -1;}int fd_dest=open(dest,O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd_dest==-1){perror("open error");return -1;}int len=lseek(fd_src,0,SEEK_END);close(fd_src);close(fd_dest);return len;
}
int main(int argc, const char *argv[])
{int len=get_len(argv[1],argv[2]);//获取读文件长度和创建写文件pid_t pid=fork();//创建子进程if(pid>0){//父进程拷贝文件前半部分copy_file(argv[1],argv[2],0,len/2);}else if(pid==0){//子进程拷贝文件后半部分copy_file(argv[1],argv[2],len/2,len-len/2);exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}waitpid(-1,NULL,0);//阻塞等待回收子进程资源return 0;
}
结果:
思维导图