902作业
1.
#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;
}
2.
#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;
}