进程思维导图

#include <head.h>
 
int main(int argc, const char *argv[])
{
	// 打开源文件和目标文件
    FILE *src = fopen("./pic/泰拉寻旅.png", "rb");
    if (src == NULL) {
        perror("打开源文件失败");
        return -1;
    }
    FILE *dest = fopen("./pic/泰拉寻旅2.png", "wb");
    if (dest == NULL) {
        perror("打开目标文件失败");
        fclose(src);
        return -1;
    }
 
    // 获取文件总大小
    fseek(src, 0, SEEK_END);
    long file_size = ftell(src);
    rewind(src);  // 将指针重置到文件开头
 
    // 计算父子进程各自拷贝的区域
    long half_size = file_size / 2;
 
    // 创建子进程
    pid_t pid = fork();
 
    if (pid < 0) 
	{
        perror("fork失败");
        fclose(src);
        fclose(dest);
        return -1;
    }
 
        if (pid == 0) {
        // 子进程:拷贝文件的后半部分
        FILE *src_child = fopen("./pic/泰拉寻旅.png", "rb");
        FILE *dest_child = fopen("./pic/泰拉寻旅2.png", "rb+"); // 打开目标文件以读写模式
        if (src_child == NULL || dest_child == NULL) {
            perror("子进程文件打开失败");
            exit(-1);
        }
 
        fseek(src_child, half_size, SEEK_SET);  // 定位到文件的后半部分
        fseek(dest_child, half_size, SEEK_SET); // 定位目标文件的后半部分
 
        char buf[128] = {0};
        size_t n;
        while ((n = fread(buf, 1, sizeof(buf), src_child)) > 0) {
            if (fwrite(buf, 1, n, dest_child) != n) {
                perror("子进程写入失败");
                fclose(src_child);
                fclose(dest_child);
                exit(-1);
            }
        }
 
        printf("子进程完成文件后半部分的拷贝。\n");
 
        fclose(src_child);
        fclose(dest_child);
        exit(0);
    }
	else
	{
        // 父进程:拷贝文件的前半部分
        char buf[128]={0};
        while (fread(buf,sizeof(buf),1, src)!=0) 
		{
            if (fwrite(buf, sizeof(buf), 1, dest) ==0) 
			{
                perror("父进程写入失败");
                fclose(src);
                fclose(dest);
                return -1;
            }
			if(ftell(src)>half_size)
			{
				break;
			}
        }
 
        printf("父进程完成文件前半部分的拷贝。\n");
 
        // 等待子进程完成
        waitpid(pid, NULL, 0);
 
        // 关闭文件
        fclose(src);
        fclose(dest);
	}
	return 0;
}
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值