一:将1.txt一半拷贝给2.txt,一半拷贝给3.txt 使用多个.c 使用makefile完成。
main.c
#include "fun.h"
int main(int argc, const char *argv[])
{
cope1();
return 0;
}
fan.c
#include "fun.h"
void cope1()
{
FILE *fp1=fopen("1.txt","r");
FILE *fp2=fopen("2.txt","w");
FILE *fp3=fopen("3.txt","w");
if(fp1==NULL)
{
perror("fopen");
return;
}
fseek(fp1,0,SEEK_END);
long fp1_leng=ftell(fp1);
fseek(fp1,0,SEEK_SET);
char *buff=malloc(fp1_leng);
fread(buff,fp1_leng/2,1,fp1);
fwrite(buff,fp1_leng/2,1,fp2);
fseek(fp1,-fp1_leng/2,SEEK_END);
fread(buff,fp1_leng/2,1,fp1);
fwrite(buff,fp1_leng/2,1,fp3);
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
fun.h
#ifndef __uhbh__
#define __uhbh__
#include<myhead.h>
void cope1();
#endif
Makefile
myexe:*.c
gcc $^ -o $@
%.o:%.c
gcc -c $^ -o $@
.PHONY:clean
clean:
rm *.o myexe
二:使用read和write实现文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
int fd1=open("1.txt",O_RDONLY);
int fd2=open("2.txt",O_CREAT|O_WRONLY|O_TRUNC,0664);
int fd3=open("3.txt",O_CREAT|O_WRONLY|O_TRUNC,0664);
if(fd1==-1||fd2==-1||fd3==-1)
{
perror("open");
return -1;
}
int len=lseek(fd1,0,SEEK_END);
lseek(fd1,0,SEEK_SET);
char a[len/2];
read(fd1,a,sizeof(a));
write(fd2,a,sizeof(a));
char b[len-len/2];
lseek(fd1,0,len/2);
read(fd1,b,sizeof(b));
write(fd3,b,sizeof(b));
close(fd1);
close(fd2);
close(fd3);
printf("拷贝成功\n");
return 0;
}
三:创建子父进程,子进程拷贝文件的前一半,父进程拷贝后一半。 1、父进程中调用子函数算出源文件长度 2、子进程执行流调用copy函数,拷贝len/2字节 3、父进程执行流调用copy函数,拷贝len-len/2字节。
#include <myhead.h>
int length_file(const char *p1,const char *p2)
{
int fd1=open("p1",O_RDONLY);
int fd2=("p2",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd1==-1||fd2==-1)
{
perror("open");
return -1;
}
int len=lseek(fd1,0,SEEK_END);
close(fd1);
close(fd2);
return len;
}
int copy_file(const char *p1,const char *p2,int start,int half)
{
int fd1=open("p1",O_RDONLY);
int fd2=("p2",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd1==-1||fd2==-1)
{
perror("open");
return -1;
}
lseek(fd1,start,SEEK_SET);
lseek(fd2,start,SEEK_SET);
char buff[100];
int sum=0;
while(1)
{
int res=read(fd1,buff,sizeof(buff));
sum+=res;
if(sum>=half||res==0)
{
write(fd2,buff,(res-(sum-half)));
break;
}
write(fd2,buff,res);
}
close(fd1);
close(fd2);
return 0;
}
int main(int argc, const char *argv[])
{
int len=length_file(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);
}
else
{
perror("fork");
return -1;
}
return 0;
}
四:创建3个进程,子进1程拷贝文件的前一半,子进程2拷贝后一半文件,父进程回收两个子进程资源。
#include <myhead.h>
int lengthfile(const char *p1,const char *p2)
{
int fd1=open(p1,O_RDONLY);
int fd2=open(p2,O_TRUNC|O_WRONLY|O_CREAT,0664);
if(fd1==-1||fd2==-1)
{
perror("open");
return -1;
}
int len=lseek(fd1,0,SEEK_END);
close(fd1);
close(fd2);
return len;
}
int copefile(const char *p1,const char *p2,int start,int len)
{
int fd1=open(p1,O_RDONLY);
int fd2=open(p2,O_WRONLY);
if(fd1==-1||fd2==-1)
{
perror("open");
return -1;
}
lseek(fd1,start,SEEK_SET);
lseek(fd2,start,SEEK_SET);
char buff[1024];
int sum=0;
while(1)
{
int res=read(fd1,buff,sizeof(buff));
sum+=res;
if(sum>len||res==0)
{
write(fd2,buff,res-(sum-len));
break;
}
write(fd2,buff,res);
}
close(fd1);
close(fd2);
}
int main(int argc, const char *argv[])
{
int pid;
int len=lengthfile("./1.txt","./2.txt");
pid=fork();
if(pid==0)
{
copefile("./1.txt","./2.txt",0,len/2);
sleep(10);
exit(0);
}
else if(pid>0)
{
int pid2=fork();
if(pid2==0)
{
copefile("./1.txt","./2.txt",len/2,len-len/2);
sleep(3);
exit(0);
}
else if(pid2>0)
{
int status;
wait(&status);
wait(&status);
printf("回收成功\n");
}
}
else
{
perror("fork");
return -1;
}
return 0;
}