多进程完成文件拷贝:2024/2/20(已修改)

作业1:使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程的资源

代码:

#include<myhead.h>

//定义获取文件长度的函数
int get_file_len(const char *srcfile, const char *destfile)
{
    //以只读的形式打开源文件
    int srcfd,destfd;
    if((srcfd = open(srcfile, O_RDONLY)) == -1)
    {
        perror("open srcfile error");
        return -1;
    }
    //以只写创建的形式打开目标文件
    if((destfd = open(destfile, O_WRONLY|O_CREAT|O_TRUNC, 0664))==-1)
    {
        perror("open destfile error");
        return -1;
    }

    //求源文件的大小
    int len = lseek(srcfd, 0, SEEK_END);

    //关闭两个文件
    close(srcfd);
    close(destfd);

    return len;
}

//定义文件拷贝函数
int copy_file(const char *srcfile, const char *destfile, int start, int len)
{
    //以只读的形式打开源文件,以只写的形式打开目标文件
    int srcfd,destfd;
    if((srcfd = open(srcfile, O_RDONLY)) == -1)
    {
        perror("open srcfile error");
        return -1;
    }
    if((destfd = open(destfile, O_WRONLY)) == -1)
    {
        perror("open destfile error");
        return -1;
    }

    //移动文件的光标
    lseek(srcfd, start, SEEK_SET);
    lseek(destfd, start, SEEK_SET);

    //完成拷贝工作
    char buf[128] = "";
    int sum = 0;
    while(1)
    {
        int res = read(srcfd, buf, sizeof(buf));
        sum += res;           //将每次读取的数据放入sum中

        if( sum>=len ||res == 0)
        {
            write(destfd, buf, res-(sum-len));    //将最后一次的内容写入
            break;
        }
        //将读取的数据写入目标文件
        write(destfd, buf, res);
    }

    //关闭文件
    close(srcfd);
    close(destfd);

    return 0;
}

/**********************主程序*******************/
int main(int argc, const char *argv[])
{
    //判断外部传参
    if(argc != 3)
    {
        printf("input file error\n");
        printf("usage:./a.out srcfile destfile\n");
        return -1;
    }

    //定义变量获取源文件的长度
    int len = get_file_len(argv[1], argv[2]);


    //创建多进程
    pid_t pid = fork();

    //判断父子进程
    if(pid > 0)
    {
        //父进程
        copy_file(argv[1], argv[2], 0, len/2);     //父进程拷贝前一半

        //阻塞等待子进程的结束
        wait(NULL);
    }else if(pid == 0)
    {
        //子进程
        copy_file(argv[1], argv[2], len/2, len-len/2);     //子进程拷贝后一半

        //退出进程
        exit(EXIT_SUCCESS);
    }else
    {
        perror("fork error");
        return -1;
    }

    printf("拷贝成功\n");


    return 0;
}

效果图:

作业2:思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值