cs
复制代码
#include<myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid = -1;
int fd1 = -1;
int fd2 = -1;
int num=0;
ssize_t s;
if (argc!=3)
{
printf("输入格式错误\n");
return -1;
}
pid = fork();
if ((fd1 = open(argv[1],O_RDONLY))==-1)
{
printf("源文件打开失败\n");
return -1;
}
printf("源文件打开成功\n");
off_t len = lseek(fd1,0,SEEK_END);
lseek(fd1,0,SEEK_SET);
close(fd1);
if (pid>0)
{
printf("父进程:%d,拷贝前一半的内容\n",getpid());
if ((fd1 = open(argv[1],O_RDONLY))==-1)
{
printf("源文件打开失败\n");
return -1;
}
printf("源文件打开成功\n");
if ((fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC))==-1)
{
printf("目标文件打开失败\n");
return -1;
}
printf("目标文件打开成功\n");
char str[128]="";
while (num<(len/2)&&(s=read(fd1,str,sizeof(str)>(len/2-num)?(len/2-num):sizeof(str)))!=0)
{
write(fd2,str,s);
num=s+num;
bzero(str,sizeof(str));
}
close(fd1);
close(fd2);
wait(NULL);
printf("已经成功回收\n");
}
else if (pid==0)
{
num=0;
printf("子进程:%d,拷贝后一半的内容\n",getpid());
if ((fd1 = open(argv[1],O_RDONLY))==-1)
{
printf("源文件打开失败\n");
return -1;
}
printf("源文件打开成功\n");
if ((fd2 = open(argv[2],O_WRONLY|O_CREAT|O_APPEND))==-1)
{
printf("目标文件打开失败\n");
return -1;
}
printf("目标文件打开成功\n");
lseek(fd1,len/2,SEEK_SET);
lseek(fd2,len/2,SEEK_SET);
char str[128]="";
while (num<(len-(len/2))&&(s=read(fd1,str,sizeof(str)>(len/2-num)?(len/2-num):sizeof(str)))!=0)
{
write(fd2,str,s);
num=s+num;
bzero(str,sizeof(str));
}
printf("子进程已拷贝\n");
close(fd1);
close(fd2);
exit(EXIT_SUCCESS);
}
return 0;
}
cs
复制代码
#include<myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid1 = -1;
int fd1 = -1;
int fd2 = -1;
int num=0;
ssize_t s;
if (argc!=3)
{
printf("输入格式错误\n");
return -1;
}
pid1 = fork();
if ((fd1 = open(argv[1],O_RDONLY))==-1)
{
printf("源文件打开失败\n");
return -1;
}
printf("源文件打开成功\n");
off_t len = lseek(fd1,0,SEEK_END);
lseek(fd1,0,SEEK_SET);
close(fd1);
if (pid1>0)
{
pid_t pid2 = fork();
if (pid2>0)
{
printf("等待两个子进程的完成\n");
waitpid(pid1,NULL,0);
waitpid(pid2,NULL,0);
printf("已经成功回收\n");
}
else if(pid2==0)
{
printf("pid2子进程:%d,拷贝前一半的内容\n",getpid());
if ((fd1 = open(argv[1],O_RDONLY))==-1)
{
printf("源文件打开失败\n");
return -1;
}
printf("源文件打开成功\n");
if ((fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC))==-1)
{
printf("目标文件打开失败\n");
return -1;
}
printf("目标文件打开成功\n");
char str[128]="";
while (num<(len/2)&&(s=read(fd1,str,sizeof(str)>(len/2-num)?(len/2-num):sizeof(str)))!=0)
{
write(fd2,str,s);
num=s+num;
bzero(str,sizeof(str));
}
close(fd1);
close(fd2);
exit(EXIT_SUCCESS);
}
}
else if (pid1==0)
{
num=0;
printf("子进程:%d,拷贝后一半的内容\n",getpid());
if ((fd1 = open(argv[1],O_RDONLY))==-1)
{
printf("源文件打开失败\n");
return -1;
}
printf("源文件打开成功\n");
if ((fd2 = open(argv[2],O_WRONLY|O_CREAT|O_APPEND))==-1)
{
printf("目标文件打开失败\n");
return -1;
}
printf("目标文件打开成功\n");
lseek(fd1,len/2,SEEK_SET);
lseek(fd2,len/2,SEEK_SET);
char str[128]="";
while (num<(len-(len/2))&&(s=read(fd1,str,sizeof(str)>(len/2-num)?(len/2-num):sizeof(str)))!=0)
{
write(fd2,str,s);
num=s+num;
bzero(str,sizeof(str));
}
printf("子进程已拷贝\n");
close(fd1);
close(fd2);
exit(EXIT_SUCCESS);
}
return 0;
}