多个进程读同一文件,拷贝到目标文件。(是为了提高效率)
子进程 copy 文件进程:
参数:源文件、目标文件、文件起始位置、文件块大小
1.打开源文件----read
2.打开目标文件---write
3.移动源文件指针到目标位置
4.移动目标文件指针到目标位置
5.从源文件读目标大小
6.从目标文件写入目标大小的内容
7.关闭源文件,目标文件
父进程:
参数:源文件、目标文件、进程数
1.校验参数(源文件是否存在)
2.将文件切片(获取文件大小/进程数)
3.创建子进程(子进程复制拷贝文件)
4.回收子进程(僵尸进程)
系统io和文件io的区别
open、read和fopen、fread:
标准文件io:自带缓冲区。需要从自己的缓冲区拷贝到内核,在从内核拷贝到磁盘,实时性不好,但是可以跨系统
系统io:直接从内核缓冲区拷贝到内核中,实时性好,只属于linux系统
子进程:
- 1 #include
- 2 #include
- 3 #include
- 4 #include
- 5 #include
- 6 #include
- 7 #include
- 8
- 9 int arg_check(const char* srcfile, int pronumber)
- 10 {
- 11 if(access(srcfile,F_OK) == -1)
- 12 {
- 13 perror("源文件不存在");
- 14 exit(0);
- 15 }
- 16 if(pronumber <= 0 || pronumber > 100)
- 17 {
- 18 perror("进程的数量请在[0-100]范围内");
- 19 exit(0);
- 20 }
- 21 return 0;
- 22 }
- 23 int block_cur(const char* srcfile,int pronumber)
- 24 {
- 25 //获取文件大小
- 26 int srcfd = open(srcfile,O_RDONLY);
- 27 int filesize = lseek(srcfd,0,SEEK_END);
- 28 if(filesize % pronumber == 0)
- 29 return filesize/pronumber;
- 30 else
- 31 return filesize/pronumber + 1;
- 32 }
- 33 int process_create(const char* srcfile, const char* desfile,int pronumber, int blocksize)
- 34 {
- 35 pid_t pid;
- 36 int flags;
- 37 for(flags = 0; flags < pronumber; flags++)
- 38 {
- 39 pid = fork();
- 40 if(pid == 0)
- 41 break;
- 42 }
- 43 if(pid > 0)
- 44 {
- 45 printf("process_create success...\n");
- 46 }
- 47 else if(pid == 0)
- 48 {
- 49 int npos = flags * blocksize;
- 50 char szblocksize[10];
- 51 char szpos[10];
- 52 sprintf(szpos,"%d",npos);
- 53 sprintf(szblocksize,"%d",blocksize);
- 54 printf("child process id[%d],file start pos [%d],blocksize[%d]\n",getpid(),npos,blocksize);
- 55 execl("/home/buka/0365file/processcopy/copy","copy",srcfile,desfile,szpos,szblocksize,NULL);
- 56 }
- 57 return 0;
- 58 }
- 59
- 60 int main(int argc, char** argv)
- 61 {
- 62 if(argc < 3)
- 63 {
- 64 perror("参数不足,请重新填写");
- 64 perror("参数不足,请重新填写");
- 65 exit(0);
- 66 }
- 67 int pronumber;
- 68 if(argv[3] == 0)
- 69 pronumber = 5;
- 70 else
- 71 pronumber = atoi(argv[3]);
- 72 //1.校验参数(源文件、目标文件、进程数)
- 73 arg_check(argv[1],pronumber);
- 74 //if(pronumber == 0)
- 75 // pronumber = 5;
- 76 //2.数据切片(将文件切为指定大小)
- 77 int nblocksize = block_cur(argv[1],pronumber);
- 78 //3.子进程的创建与拷贝
- 79 process_create(argv[1],argv[2],pronumber,nblocksize);
- 80 //4.回收子进程(僵尸进程)
- 81 pid_t zid;
- 82 while((zid = waitpid(-1,0,WNOHANG)) != -1)
- 83 {
- 84 if(zid > 0)
- 85 {
- 86 printf("zombie process id [%d]\n",zid);
- 87 }
- 88 }
- 89
- 90
- 91
- 92 return 0;
- 93 }
父进程:
- 1 #include
- 2 #include
- 3 #include
- 4 #include
- 5 #include
- 6 #include
- 7
- 8 int main(int arg, char** argv)
- 9 {
- 10 //1.校验参数 源文件、目标文件、起始位置、文件块大小
- 11 if(arg < 4){
- 12 perror("参数不足");
- 13 exit(0);
- 14 }
- 15 //2.打开源文件--read
- 16 int srcfd = open(argv[1],O_RDONLY);
- 17 if(srcfd == -1)
- 18 {
- 19 perror("open read file failed");
- 20 exit(0);
- 21 }
- 22 //3.打开目标文件--write
- 23 int desfd = open(argv[2],O_WRONLY|O_CREAT,0664);
- 24 if(desfd == -1)
- 25 {
- 26 perror("open write file failed");
- 27 exit(0);
- 28 }
- 29 //4.移动源文件指针
- 30 int npos = atoi(argv[3]);
- 31 lseek(srcfd,npos,SEEK_SET);
- 32 //5.移动目标文件指针
- 33 lseek(desfd,npos,SEEK_SET);
- 34 //6.读源文件内容
- 35 int nbuffersize = atoi(argv[4]);
- 36 char szbuf[nbuffersize];
- 37 int readlen = read(srcfd,szbuf,nbuffersize);
- 38 if(readlen == -1)
- 39 {
- 40 perror("read file erro");
- 41 exit(0);
- 42 }
- 43 //7.项目表文件写入文件内容
- 44 write(desfd,szbuf,readlen);
- 45 //8.关闭源文件、目标文件
- 46 close(srcfd);
- 47 close(desfd);
- 48
- 49
- 50 return 0;
- 51 }