作业
1> 使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
#include <myhead.h>
void cp(const char *src_file,const char *dst_file,int start,int end){
FILE *fp_src = fopen(src_file,"r");
FILE *fp_dst = fopen(dst_file,"a");
if(fp_src == NULL || fp_dst == NULL){
perror("fopen error");
return;
}
fseek(fp_src,start,SEEK_SET);
fseek(fp_dst,start,SEEK_SET);
char buf[1];
while(ftell(fp_src) < end){
fread(buf,sizeof(char),sizeof(buf),fp_src);
fwrite(buf,sizeof(char),sizeof(buf),fp_dst);
}
fclose(fp_src);
fclose(fp_dst);
printf("拷贝成功\n");
}
int main(int argc, const char *argv[])
{
char src_file[] = "../1/01test.c";
char dst_file[] = "./aaa.txt";
FILE *fp = fopen(src_file,"r");
if(fp == NULL){
perror("fopen error");
return -1;
}
fseek(fp,0,SEEK_END);
int end = ftell(fp);
int mid = end / 2;
pid_t pid;
pid = fork();
if(pid < 0){
perror("fork error");
return -1;
}else if(pid == 0){
printf("子进程已创建\n");
cp(src_file,dst_file,mid,end);
exit(EXIT_SUCCESS);
}else{
printf("父进程已创建\n");
cp(src_file,dst_file,0,mid);
wait(NULL);
}
fclose(fp);
return 0;
}
效果图:
2> 使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
#include <myhead.h>
void cp(const char *src_file,const char *dst_file,int start,int end){
FILE *fp_src = fopen(src_file,"r");
FILE *fp_dst = fopen(dst_file,"a");
if(fp_src == NULL || fp_dst == NULL){
perror("fopen error");
return;
}
fseek(fp_src,start,SEEK_SET);
fseek(fp_dst,start,SEEK_SET);
char buf[1] = {};
while(ftell(fp_src) < end){
fread(buf,sizeof(char),sizeof(buf),fp_src);
fwrite(buf,sizeof(char),sizeof(buf),fp_dst);
}
fclose(fp_src);
fclose(fp_dst);
printf("拷贝成功\n");
}
int main(int argc, const char *argv[])
{
char src_file[] = "../1/01test.c";
char dst_file[] = "./bbb.txt";
FILE *fp = fopen(src_file,"r");
if(fp == NULL){
perror("fopen error");
return -1;
}
fseek(fp,0,SEEK_END);
int end3 = ftell(fp);
int end1 = end3/3;
int end2 = end3/3*2;
pid_t pid1;
pid1 = fork();
if(pid1 < 0){
perror("fork1 error");
return -1;
}else if(pid1 == 0){
printf("子进程1创建成功\n");
cp(src_file,dst_file,end1,end2);
exit(EXIT_SUCCESS);
}else{
pid_t pid2;
pid2 = fork();
if(pid2 < 0){
perror("fork2 error");
return -1;
}else if(pid2 == 0){
sleep(3);
printf("子进程2创建成功\n");
cp(src_file,dst_file,end2,end3);
exit(EXIT_SUCCESS);
}else{
printf("父进程创建成功\n");
cp(src_file,dst_file,0,end1);
wait(NULL);
wait(NULL);
}
}
return 0;
}
效果图: