23111 IO进程线程 day4

思维导图

23111 IO进程线程 day4_第1张图片

创建出三个进程完成两个文件之间拷贝工作,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程回收子进程的资源
 

#include

//文件长度
int file_length(const char *strfile,const char *dstfile)
{
	int strfd=-1;
	int dstfd=-1;
	//以只读的形式打开源文件
	if((strfd=open(strfile,O_RDONLY,0664))==-1)
	{
		perror("strfd open error");
		return -1;
	}

	//以读写的形式打开目标文件
	if((dstfd=open(dstfile,O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("dstfd open error");
		return -1;
	}

	//源文件的大小
	int len=lseek(strfd,0,SEEK_END);
	
	return len;
}

//文件复制函数
int file_copy(const char *strfile,const char *dstfile,int start,int len)
{
	int strfd,dstfd;
	//以只读的形式打开源文件
	if((strfd=open(strfile,O_RDONLY,0664))==-1)
	{
		perror("strfd open error");
		return -1;
	}

	//以读写的形式打开目标文件
	if((dstfd=open(dstfile,O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("dstfd open error");
		return -1;
	}
	
	//将两个文件的光标定位在同一位置
	lseek(strfd,start,SEEK_SET);
	lseek(dstfd,start,SEEK_SET);

	char buf[128]="";
	int res=0;

	//定义拷贝字节大小的变量
	int sum=0;

	while(1)
	{
		//读取源文件
		res=read(strfd,buf,sizeof(buf));
		sum+=res;
		if(res==0||sum>=len)
		{
            //将最后一次读取的内容写入文件
			write(dstfd,buf,res-(sum-len));
			break;
		}

		//将内容写入目标文件
		write(dstfd,buf,res);

		//关闭文件
		close(strfd);
		close(dstfd);
		return 0;
	}


}

int main(int argc, const char *argv[])
{
	//外部传参
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usge:a.out strfile dstfile\n");
		return -1;
	}

	//计算文件长度
	int len=file_length(argv[1],argv[2]);
	

	pid_t pid=-1;

	//创建一个子进程1
	pid=fork();
	
	if(pid==0)
	{
		printf("子进程1\n");
		//拷贝前半部分
		file_copy(argv[1],argv[2],0,len/2);
		printf("前一半拷贝成功\n");

		//结束进程
		exit(EXIT_SUCCESS);
	}
	else if(pid>0)
	{
		pid_t pid2=-1;

		//创建子进程2
		pid2=fork();
		if(pid2==0)
		{
			printf("子进程2\n");
			//拷贝后半部分
			file_copy(argv[1],argv[2],len/2,len-len/2);
			printf("后一半拷贝成功\n");

			//结束进程
			exit(EXIT_SUCCESS);
		}
		else if(pid2>0)
		{
            //父进程
			//回收子进程资源
			wait(NULL);
			wait(NULL);
			printf("拷贝成功\n");
		}
		else
		{
			perror("fork 2 error");
			return -1;
		}
	}
	else
	{
		perror("fork 1 error");
		return -1;
	}

	return 0;
}

23111 IO进程线程 day4_第2张图片

你可能感兴趣的:(linux,算法)