2022-12-8作业(2)

子进程先拷贝一张图片后半部分,父进程后拷贝后半部分

代码实现如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
	//打开文件
	int fd, fd1;
	fd = open(argv[1],O_RDONLY);
	if(fd < 0)
	{
		perror("open");
		return -1;
	}
	
	fd1 = open("copy.png",O_WRONLY|O_CREAT|O_TRUNC, 0664);
	if(fd1 < 0)
	{
		perror("open");
		return -1;
	}

	//文件大小
	off_t size = lseek(fd,0,SEEK_END);

	//判断文件大小的奇偶性
	int flag = size%2 == 0 ? 0:1;

	pid_t pid = fork();
	if(pid > 0)
	{
		//父进程执行
		sleep(1);    //父进程先休眠1秒,使子进程先完成拷贝
		lseek(fd,0,SEEK_SET);
		lseek(fd1,0,SEEK_SET);
		
		char c = 0;
		for(int i = 0; i < size/2; i++)
		{
			if(read(fd, &c, 1) < 0)
			{
				perror("read");
				return -1;
			}
			if(write(fd1, &c, 1) < 0)
			{
				perror("write");
				return -1;
			}
		}
		printf("文件前半部分拷贝完毕\n");
	}
	else if(0 == pid)
	{
		//子进程执行
		lseek(fd,size/2,SEEK_SET);
		lseek(fd1,size/2,SEEK_SET);

		char c = 0;
		for(int i = 0; i < size/2+flag; i++)
		{
			if(read(fd, &c, 1) < 0)
			{
				perror("read");
				return -1;
			}
			if(write(fd1, &c, 1) < 0)
			{
				perror("write");
				return -1;
			}
		}
		printf("文件后半部分拷贝完毕\n");
	}
	//关闭文件
	close(fd);
	close(fd1);
	return 0;
}

运行结果如下:

ubuntu@ubuntu:copy$ gcc copy.c
ubuntu@ubuntu:copy$ ./a.out png.png 
文件后半部分拷贝完毕
文件前半部分拷贝完毕
ubuntu@ubuntu:copy$ diff png.png copy.png 
ubuntu@ubuntu:copy$ 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值