1、使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
#include<myhead.h>
void filecopy(const char *src,const char *dest,int start,int end){
FILE* src_file=fopen(src,"r"); //以只读的方式打开被复制文件
FILE* dest_file=fopen(dest,"a"); //以追加的方式打开目标文件if(src_file==NULL||dest_file==NULL){
perror("open error"); //判断是否打开失败
return;
}fseek(src_file,start,SEEK_SET); //将被复制文件光标定位在开头
fseek(dest_file,start,SEEK_SET); //将目标文件的光标定位在开头int copy=end-start;
while(copy>0){ //进行copy
char buf=fgetc(src_file);
fputc(buf,dest_file);
copy--;
}fclose(src_file); //关闭被复制文件
fclose(dest_file); //关闭目标文件
}int main(int argc, const char *argv[])
{
if(argc!=3){ //终端输入被复制文件和目标文件
printf("input file error\n");
printf("usage: ./cope srcfile destfile\n");
return -1;
}
int file_size = 0; //初始化需要复制文件的长度
FILE* fp = fopen(argv[1], "r"); //以只读的方式打开被复制文件
if (fp == NULL) {
perror("open error"); //判断是否打开失败
return -1;
}
fseek(fp, 0, SEEK_END);
file_size = ftell(fp); //得到文件长度
fclose(fp); //关闭文件
FILE* fp2 = fopen(argv[2], "w"); //以只写的方式打开被复制文件,为了清空目标文件已有的内容
if (fp2 == NULL) {
perror("open error"); //判断是否打开失败
return -1;
}
fclose(fp2); //关闭文件int half_size=file_size/2; //找到文件的二分之一位置
pid_t pid=fork(); //创建进程
if(pid<0){
perror("fork error"); //判断是否创建进程失败
return -1;
}else if(pid==0){
filecopy(argv[1],argv[2],half_size,file_size); //子进程中复制文件后一半的内容到目标文件中
exit(EXIT_SUCCESS); //退出子进程
}else{
filecopy(argv[1],argv[2],0,half_size); //父进程中复制文件前一半的内容到目标文件中
wait(NULL); //回收子进程的资源
printf("拷贝成功\n");
}
return 0;
}
2、使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
#include<myhead.h>
void filecopy(const char *src,const char *dest,int start,int end){
FILE* src_file=fopen(src,"r"); //以只读的方式打开被复制文件
FILE* dest_file=fopen(dest,"a"); //以追加的方式打开目标文件if(src_file==NULL||dest_file==NULL){
perror("open error"); //判断是否打开失败
return;
}fseek(src_file,start,SEEK_SET); //将被复制文件光标定位在开头
fseek(dest_file,start,SEEK_SET); //将目标文件的光标定位在开头int copy=end-start;
while(copy>0){ //进行copy
char buf=fgetc(src_file);
fputc(buf,dest_file);
copy--;
}fclose(src_file); //关闭被复制文件
fclose(dest_file); //关闭目标文件
}int main(int argc, const char *argv[])
{
if(argc!=3){ //终端输入被复制文件和目标文件
printf("input file error\n");
printf("usage: ./cope srcfile destfile\n");
return -1;
}
int file_size = 0; //终端输入被复制文件和目标文件
FILE* fp = fopen(argv[1], "r"); //以只读的方式打开被复制文件
if (fp == NULL) {
perror("open error"); //判断是否打开失败
return -1;
}
fseek(fp, 0, SEEK_END);
file_size = ftell(fp); //得到文件长度
fclose(fp); //关闭文件
FILE* fp2 = fopen(argv[2], "w"); //以只写的方式打开被复制文件,为了清空目标文件已有的内容
if (fp2 == NULL) {
perror("open error"); //判断是否打开失败
return -1;
}
fclose(fp2); //关闭文件int first_size=file_size/3; //找到文件的三分之一位置
int second_size=first_size*2; //找到文件的三分之二位置pid_t pid=fork(); //创建进程
if(pid<0){
perror("fork error"); //判断是否创建进程失败
return -1;
}else if(pid==0){
filecopy(argv[1],argv[2],second_size,file_size); //子进程中复制文件最后三分之一的内容到目标文件中
exit(EXIT_SUCCESS); //退出子进程
}else{
pid_t pid2=fork();
if(pid2<0){
perror("fork error");
return -1;
}else if(pid2==0){
filecopy(argv[1],argv[2],first_size,second_size); //子进程中复制文件中间三分之一的内容到目标文件中
exit(EXIT_SUCCESS); //退出子进程
}else{
filecopy(argv[1],argv[2],0,first_size); //父进程中复制文件最前面三分之一的内容到目标文件中
wait(NULL); //回收子进程的资源
wait(NULL); //回收子进程的资源
printf("拷贝成功\n");
}
}
return 0;
}