10/11作业

1. 用文件 IO 拷贝一张图片,要求子进程先拷贝后半部分,父进程后拷贝前半部分。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, const char *argv[])
{
	int fd_r = open("./1.bmp",O_RDONLY);
	if(fd_r <0)
	{
		perror("open");
		return -1;
	}

	int fd_w = open("copy.bmp",O_WRONLY|O_CREAT|O_TRUNC,0777);
	if(fd_w < 0)
	{
		perror("open");
		return -1;
	}

	off_t size = lseek(fd_r,0,SEEK_END);
	printf("size=%ld\n",size);

	//创建子进程
	pid_t pid = fork();
	if(pid > 0)
	{
		sleep(2);

		//父进程执行,拷贝前半部分,所以要偏移到开头位置
		lseek(fd_r,0,SEEK_SET);
		lseek(fd_w,0,SEEK_SET);

		char c = 0;
		int i = 0;
		for(i=0;i<size/2;i++)
		{
			read(fd_r,&c,1);
			write(fd_w,&c,1);
		}
		printf("文件前半部分拷贝完毕\n"):
	}
	else if(pid == 0)
	{
		//子进程执行,拷贝后半部分,所以要偏移到中间位置
		lseek(fd_r,size/2,SEEK_SET);
		lseek(fd_w,size/2,SEEK_SET);

		char c = 0;
		int i = 0;
		for(i=size/2;i<size;i++)
		{
			read(fd_r,&c,1);
			write(fd_w,&c,1);
		}
		printf("文件后半部分拷贝完毕\n");
	}
	else if(pid < 0)
	{
		perror("fork");
		return -1;
	}

	close(fd_w);
	close(fd_r);
	return 0;
}
2. 用文件 IO 拷贝一张图片,要求子进程拷贝后半部分,父进程拷贝前半部分。不允许使用
sleep(1) 函数。
说明,父子进程不会相互干扰,即系统文件表不使用同一张即可。 --- 》说明父进程开一次文
件,子进程自己开一次文件。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
 
int main(int argc, const char *argv[])
{
	int dp,ldp;   		//源文件,目标文件
	int res=1;         //接收read返回值的变量
	char str[60];         //字符串数组
	int count = 0;
 
	int len;            //文件长度
	len = lseek(dp,0,SEEK_END);//文件总大小byte
 
	pid_t pid = fork();        //创建子进程
 
	if(pid<0)           //判断是否创建成功
	{
		perror("fork");
		return -1;
	}
	else if(pid==0)
	{
		//子进程代码区
		dp=open("./1.bmp",O_RDONLY);//只读打开
		if(dp<0)              //判断是否打开成功
		{
			perror("open");
			return -1;
		}
		ldp=open("./copy.bmp",O_WRONLY|O_CREAT,0666);//只写打开,目标文件
		if(ldp<0)//判断是否打开成功
		{
			perror("open");
			return -1;
		}
		printf("子进程\n");
		lseek(dp,len/2,SEEK_SET);
		//光标偏移到文件中间的位置 
		lseek(ldp,len/2,SEEK_SET);
		while(1)
		{
			bzero(str,sizeof(str));//清空字符数组
			res=read(dp,str,sizeof(str));//读取字符串
			write(ldp,str,res);//写入字符串,注意只能写res个,不能写sizeof(str)个
			if(res==0)//读到结尾
				break;
			if(res<0)//读取失败
			{
				perror("read");
				return-1;
			}
			//	close(dp);
			//	close(ldp);
		}
 
	}
	else
	{
		//父进程代码区
		dp=open("./1.bmp",O_RDONLY);
		if(dp<0)
		{
			perror("open");
			return -1;
		}
		ldp=open("./copy.bmp",O_WRONLY|O_CREAT,0666);
		if(ldp<0)
		{
			perror("open");
			return -1;
		}
		printf("父进程\n");
		lseek(dp,0,SEEK_SET);
		lseek(ldp,0,SEEK_SET);
		while(res>0)
		{
			count +=res;
			res=read(dp,str,sizeof(str));
			write(ldp,str,res);
			if(count>=len/2)
				break;
		}
	}
	close(dp);//关闭目标文件
	close(ldp);//关闭源文件
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值