1、使用父子进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,子进程结束后退出,父进程回收子进程的资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
//判断输入的格式是否符合要求
if(argc != 3)
{
printf("you should input:./a.out file1 file2\n");
return -1;
}
//定义变量存储文件描述符
int srcfd = -1;
int destfd = -1;
//以只读的形式打开源文件
if((srcfd = open(argv[1],O_RDONLY)) == -1)
{
perror("open srcfd error");
return -1;
}
//以读写的形式打开目标文件
if((destfd = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open destfd error");
return -1;
}
//定义一个容器接收数据
char buf;
//记录文件长度
int len = lseek(srcfd,0,SEEK_END);
int sum = 0;
int res = 0;
//创建一个子进程
pid_t pid = fork();
//判断父亲进程和子进程
if(pid > 0)
{
//把光标指向文件开头
lseek(srcfd,0,SEEK_SET);
lseek(destfd,0,SEEK_SET);
while(1)
{
res = read(srcfd,&buf,sizeof(buf));
if(res == 0)
{
break;
}
sum += res;
//如果sum的总数小于文件大小的一半,就向目标文件进行写入
if(sum <= len/2)
{
write(destfd,&buf,res);
}
else
{
break;
}
}
}
else if(pid == 0)
{
//将光标指向文件中间
lseek(srcfd,len/2,SEEK_SET);
lseek(destfd,len/2,SEEK_SET);
while(1)
{
res = read(srcfd,&buf,sizeof(buf));
//如果res == 0,说明内容已经读完,就退出循环
if(res == 0)
{
break;
}
write(destfd,&buf,res);
}
}
//资源回收
wait(NULL);
//关闭文件
close(srcfd);
close(destfd);
return 0;
}
输出结果如下:成功将文件copy.c的内容拷贝到file1.txt文件中