1.4 day4 IO进程线程

使用两个子进程进行文件拷贝,父进程进行资源回收

#include 
int main(int argc, const char *argv[])
{
	//创建一个文件描述符并以只读的方式打开
	int fd=-1;
	if((fd=open("./test.bmp",O_RDONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	//使用lseek计算数据大小,确定数据的中心位置
	int len=(lseek(fd,0,SEEK_END))/2;
	close(fd);

	
	int pid=-1;
	int res;//将读取到的数据存入res中
	int sum=0;//计算已经读取了多少
	char buf[128]="";//定义一个存放数据的容器
	
	//创建一个子进程1,拷贝一半文件
	pid=fork();
	if(pid==0)
	{
		//子进程
		//以只读的方式打开源文件,再以只写的方式打开目标文件
		int fd=-1;
		int cfd=-1;
		if((fd=open("./test.bmp",O_RDONLY))==-1)
		{
			perror("open error");
			return -1;
		}
		if((cfd=open("./aa.bmp",O_WRONLY|O_CREAT,0664))==-1)
		{
			perror("open error");
			return -1;
		}
		//将光标定位到相同位置
		lseek(fd,0,SEEK_SET);
		lseek(cfd,0,SEEK_SET);
		//循环将读取到的数据写入目标文件内
		while((res=read(fd,buf,sizeof(buf)))!=0)
		{
			//计算已经读取了多少,如果读取到的数据等于或超过一半则退出循环
			sum+=res;
			if(sum>=len)
			{
                write(cfd,buf,res-(sum-len));
				break;
			}
			write(cfd,buf,res);
		}
		//关闭文件描述,以及子进程1
		close(fd);
		close(cfd);
		exit(EXIT_SUCCESS);

	}else if(pid>0)
	{
		//创建一个新的子进程2
		int pid2=-1;
		pid2=fork();
		if(pid2==0)
		{
			//子进程2
			//重复子进程1的操作
			int fd=-1;
			int cfd=-1;
			if((fd=open("./test.bmp",O_RDONLY))==-1)
			{
				perror("open error");
				return -1;
			}
			if((cfd=open("./aa.bmp",O_WRONLY|O_CREAT,0664))==-1)
			{
				perror("open error");
				return -1;
			}

			//将两个文件的光标定位到中间-1的位置
			lseek(fd,len-1,SEEK_SET);
			lseek(cfd,len-1,SEEK_SET);
			while((res=read(fd,buf,sizeof(buf)))!=0)
			{
				write(cfd,buf,res);
			}
			close(fd);
			close(cfd);
			exit(EXIT_SUCCESS);
		}else if(pid2>0)
		{
			//父进程
			//阻塞回收子进程1和子进程2
			wait(NULL);
			wait(NULL);
		}else
		{
			perror("fork error");
			return -1;
		}
		printf("拷贝完成\n");
	}
	return 0;
}

1.4 day4 IO进程线程_第1张图片

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