1.使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源.
#include <myhead.h>
int main(int argc, const char *argv[])
{
//打开文件
FILE *fp;
FILE *fp1;
if((fp=fopen("./ddd.txt","r"))==NULL){
perror("fopen error");
return -1;
}
if((fp1=fopen("./eee.txt","w"))==NULL){
perror("fopen error");
return -1;
}
//创建进程
pid_t pid;
pid=fork();
//求出拷贝文件的长度,并将位置指针指向头
int flen=lseek(fp->_fileno,0,SEEK_END); //用的文件IO求大小
fseek(fp,0,SEEK_SET); //用标准IO光标指向首地址
//进入父进程
if(pid<0){
perror("cpy error");
return -1;
}
else if(pid>0){
printf("开始拷贝前一半\n");
//开始拷贝
char buf;
int ret;
//循环,一个一个字符拷贝文件
while((ftell(fp))<=flen/2){
if((ret=fread(&buf,1,1,fp))==0){
break;
}
fwrite(&buf,1,1,fp1);
//因为是标准IO,所以一定要刷新,才能将拷贝的内容从缓存区提取出来
//!!!!!!!
fflush(fp1);
}
//等待子进程结束再回收
wait(NULL);
}
//进入子进程
else{
printf("开始拷贝后一半\n");
char buf;
int ret;
//将读和写的光标都指向前一半的最后,开始拷贝后半段
fseek(fp,flen/2+1,SEEK_SET);
fseek(fp1,0,SEEK_END);
//循环还是老样子,到文件结束而结束
while((ftell(fp))>=flen/2&&(ftell(fp))<flen){
if((ret=fread(&buf,1,1,fp))==0){
break;
}
fwrite(&buf,1,ret,fp1);
}
}
//关闭文件
fclose(fp);
fclose(fp1);
return 0;
}
实现效果:
2.使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
if(argc!=3){
perror("error");
return -1;
}
//创建一个读文件描述符
int fp= open(argv[1], O_RDONLY);
if(fp < 0)
{
perror("open");
return -1;
}
//创建一个写文件描述符
int fp1 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0664);
if(fp1< 0)
{
perror("open");
return -1;
}
off_t file_size = lseek(fp, 0, SEEK_END);
printf("文件的大小是%ld字节\n", file_size);
pid_t pid=fork();
if(pid<0){
perror("cpy error");
return -1;
}
else if(pid>0){
wait(NULL);
pid_t pid1=fork();
if(pid1<0){
perror("cpy error");
return -1;
}
else if(pid1>0){
printf("开始拷贝前1/3\n");
lseek(fp,0,SEEK_SET);
lseek(fp1,0,SEEK_SET);
char buf;
for(int i=0;i<=file_size/3;i++){
if((read(fp,&buf,1))<0){
perror("read error");
return -1;
}
if(write(fp1,&buf,1)<0){
perror("write error");
return -1;
}
}
wait(NULL);
}
else{
printf("开始拷贝中间1/3\n");
lseek(fp,file_size/3,SEEK_SET);
lseek(fp1,file_size/3,SEEK_SET);
char buf;
for(int i=(file_size/3);i<(file_size/3*2);i++){
if((read(fp,&buf,1))<0){
perror("read error");
return -1;
}
if(write(fp1,&buf,1)<0){
perror("write error");
return -1;
}
}
}
}
else{
printf("开始拷贝最后1/3\n");
lseek(fp,file_size/3*2,SEEK_SET);
lseek(fp1,file_size/3*2,SEEK_SET);
char buf;
for(int i=(file_size/3*2);i<(file_size);i++){
if((read(fp,&buf,1))<0){
perror("read error");
return -1;
}
if(write(fp1,&buf,1)<0){
perror("write error");
return -1;
}
}
}
close(fp);
close(fp1);
return 0;
}
实现效果: