1.
2.
#include "myhead.h"
int main(int argc, const char *argv[])
{
int fd=-1;//创建一个文件写入东西
if((fd=open("./text.txt",O_RDWR|O_CREAT|O_TRUNC,0664))==-1){
perror("create error");
return -1;}
char wbuf[128]="HELLO world";
write(fd,wbuf,strlen(wbuf));
int length=lseek(fd,0,SEEK_END);//计算文件有多长
printf("length=%d\n",length);
close(fd);
if((fd=open("./text.txt",O_RDONLY))==-1){
perror("open error");
return -1;
}
int fd1=-1;//创建另一个文件用于拷贝
if((fd1=open("./1text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){
perror("w error");
return -1;
}
int fd2=-1;//多次使用open打开第一个文件,独立控制光标
if((fd2=open("./text.txt",O_RDONLY))==-1){
perror("open error");
return -1;
}
int pid1=-1;//创建3个进程
pid1=fork();
if(pid1>0){
int pid2=-1;
pid2=fork();
if(pid2>0){
printf("是父进程,第一个子进程pid:%d,第二个子进程:pid:%d\n",pid1,pid2);
wait(NULL);
wait(NULL);
}else if(pid2 == 0){
printf("第二个子进程\n");//在第一个进程中读取一半
for(int i=0;i<(length/2);i++){
char rbuf[128];
read(fd,rbuf,1);
write(fd1,rbuf,1);//拷贝到文件中
write(1,rbuf,1);//回显到终端看一下
}
puts("\n");
exit(EXIT_SUCCESS);//结束进程
}else{
perror("fork error");
return -1;
}
}else if(pid1 == 0){
printf("第一个子进程\n");//在第二个进程中读取另一半
lseek(fd2,(length/2),SEEK_SET);//将光标定位到一半的位置
for(int i=(length/2);i<length;i++){
char rbuf1[128];
read(fd2,rbuf1,1);
write(fd1,rbuf1,1);
write(1,rbuf1,1);
}
puts("\n");
exit(EXIT_SUCCESS);
}else{
perror("fork error");
return -1;
}
close(fd);//关闭文件
close(fd2);
return 0;
}