使用双进程拷贝文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
int main()
{
char Buf[8]=""; //定义一个32字节的数组
int fd,fd1,n;
ssize_t ret,ret1;
if((fd=open("Text.txt",O_RDONLY))==-1) //只读形式打开第一个文件
{
perror("open file");
return -1;
}
if((fd1=open("Text_1.txt",O_WRONLY|O_CREAT|O_TRUNC,0666))==-1)//只写形式打开第二个文件
{
perror("open file");
return -1;
}
ret=lseek(fd,0,SEEK_END); //计算文件的内容共有多少个字节
printf("%ld\n",ret);
ret1=(ret/2)-(ret/2)%8; //计算前半段元素数量
printf("%ld\n",ret1);
lseek(fd,0,SEEK_SET); //将光标移动到文件的开始
pid_t pid_a=fork(); //创建新进程
if(pid_a < 0)
{
perror("fork error");
return -1;
}
else if(pid_a==0) //子进程执行内容
{
lseek(fd,ret1,SEEK_SET); //将光标移动到后半部分
ret=ret-ret1; //计算剩下的元素
for(off_t i=0;i<(ret/8+1);i++) //根据文件的大小计算循环次数
{
n=read(fd,Buf,sizeof(Buf)); //读取文件的内容并返回读取的字节数
write(fd1,Buf,n); //向第二个文件写入读到相应数量的内容
}
exit(EXIT_SUCCESS);
}else //父进程执行内容
{
for(off_t i=0;i<(ret1/8);i++) //根据文件的大小计算循环次数 (ret1/32)
{
n=read(fd,Buf,sizeof(Buf)); //读取文件的内容并返回读取的字节数
write(fd1,Buf,n); //向第二个文件写入读到相应数量的内容
}
waitpid(pid_a, NULL, 0); //回收进程资源
}
close(fd); //关闭文件
close(fd1);
return 0;
}