Day24

思维导图

在这里插入图片描述

父子进程关系图
在这里插入图片描述
父子进程内存问题
在这里插入图片描述
进程切换
在这里插入图片描述

练习

使用父子进程完成拷贝文件

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//对参数个数进行判断
	if(argc != 3)
	{
		printf("file count error\n");
		printf("urage:./a.out srcfile destfile\n");
		return -1;
	}

	//定义文件描述符
	int fd_src, fd_dest;

	//以只读的形式打开文件
    if((fd_src = open(argv[1], O_RDONLY)) == -1)
    {
        perror("open file");
        return -1;
    }

	//以读写的形式打开文件
    if((fd_dest = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0664)) == -1)
    {
        perror("open file");
        return -1;
    }

	//获得源文件大小
	off_t size = lseek(fd_src, 0, SEEK_END);
	printf("size = %ld\n", size);
	//子进程读取拷贝文件大小
	off_t size_child = size/2;
	printf("size_child = %ld\n", size_child);
	//父进程读取拷贝文件大小
	off_t size_father = size - size_child;
	printf("size_father = %ld\n", size_father);
	
	char buf[10];
	//生成一个子进程
	pid_t pid = fork();

	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)//子进程拷贝前半段
	{
		lseek(fd_src, 0, SEEK_SET);//移动光标至开头
		off_t ret,num=0;
		while((ret = read(fd_src, buf, sizeof(buf))) > 0 && num < size_child)
		{
			if(num+ret > size_child)
				ret = size_child-num;
			write(fd_dest, buf, ret);		
			num += ret;
		}
		exit(EXIT_SUCCESS);
	}else//父进程拷贝后半段
	{
		wait(NULL);//阻塞等待子进程结束并为其收尸
		lseek(fd_src, size_child, SEEK_SET);//移动光标
		lseek(fd_dest, size_child, SEEK_SET);
		off_t ret;
		while((ret = read(fd_src, buf, sizeof(buf))) > 0)
		{
			write(fd_dest, buf, ret);	
		}
	}

	close(fd_src);
	close(fd_dest);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值