进程之拷贝文件

 

1> 使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源

//使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
    //定义两个文件描述符
    int srcfd,destfd;
    if((srcfd=open("./01copy.c",O_RDONLY))==-1)
    {
        perror("open srcfile error");
        return -1;
    }
    //以写的方式打开目标文件
    if((destfd=open("./copy.c",O_WRONLY|O_CREAT|O_TRUNC,0776))==-1)
    {
        perror("open destfile error");
        return -1;
    }

    //求出文件大小,方便划分前半,后半
    int size=lseek(srcfd,0,SEEK_END);

    //定义搬运工
    char buf[128];

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

    if(pid > 0)           //判断如果是父进程
    {
        sleep(8);
        //重新定位光标,把光标定在源文件开始
        lseek(srcfd,0,SEEK_SET);
        //把光标定义在拷贝文件的开始
        lseek(destfd,0,SEEK_SET);
        //开始循环拷贝
        for(int i=0;i<size/2;i++)
        {
            int ret=read(srcfd,buf,sizeof(buf));
            write(destfd,buf,ret);
        }
        printf("父进程拷贝前一半内容成功\n");

        //父进程阻塞回收子进程资源
        wait(NULL);
        waitpid(pid,NULL,WNOHANG);
        // _exit(EXIT_SUCCESS);
    }else if(pid==0)
    {
        sleep(4);

        //再次重新定位光标
        //lseek(srcfd,size/2,SEEK_SET);
        //lseek(destfd,size/2,SEEK_SET);

        for(int j=size/2;j<=size;j++)
        {
            int ret=read(srcfd,buf,sizeof(buf));
            write(destfd,buf,ret);
        }
        printf("子进程拷贝后一半内容成功\n");
        _exit(EXIT_SUCCESS);              //退出程序,不刷新缓冲区
    }                                     //如果不退出一个程序,会出现文件拷贝成功x2
    //父程序或者子程序任选一个退出,两个都退出,不出现文件拷贝成功

    close(srcfd);
    close(destfd);

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

    return 0;
}
                                                                                                                           
                                                                                                                           
                                                                                                                           
                                                                                                                           
                                                                                                                           

 2> 使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源

//2>使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
    //定义两个文件描述符
    int srcfd,destfd;
    if((srcfd=open("./picture.png",O_RDONLY))==-1)
    {
        perror("open srcfile error");
        return-1;
    }
    if((destfd=open("./copy.png",O_WRONLY|O_CREAT|O_TRUNC,0776))==-1)
    {
        perror("open destfile error");
        return -1;
    }
    //求文件大小
    int size=lseek(srcfd,0,SEEK_END);

    //搬运工
    char buf[128]="";

    //创建子进程1
    pid_t pid1=fork();
    if(pid1<0)
    {

        perror("fork error");
        return -1;
    }
    else if(pid1==0)
    {
        //sleep(1);子进程1
        lseek(srcfd,2*size/3,SEEK_SET);
        lseek(destfd,2*size/3,SEEK_SET);

        for(int i=2*size/3;i<=size;i++)
        {
            int ret=read(srcfd,buf,sizeof(buf));
            write(destfd,buf,ret);
        }
        printf("文件后1/3拷贝成功\n");
        _exit(EXIT_SUCCESS);
    }
    else
    {
        //创建子进程2
        pid_t pid2=fork();
        if(pid2<0)
        {
            perror("fork error");
            return -1;
        }else if(pid2==0)
        {
            sleep(4);
            //重新定位光标
            lseek(srcfd,size/3,SEEK_SET);
            lseek(destfd,size/3,SEEK_SET);

            for(int i=size/3;i<2*size/3;i++)
            {
                int ret=read(srcfd,buf,sizeof(buf));
                write(destfd,buf,ret);
            }
            printf("文件中间1/3拷贝成功\n");
            _exit(EXIT_SUCCESS);
        }
        else
        {
            lseek(srcfd,0,SEEK_SET);
            lseek(destfd,0,SEEK_SET);

            //父进程
            sleep(5);
            for(int i=0;i<size/3;i++)
            {
                int ret=read(srcfd,buf,sizeof(buf));
                write(destfd,buf,ret);                                                                                                                                                     
            }
            printf("文件前1/3拷贝成功\n");
            sleep(7);
            wait(NULL);
            wait(NULL);
        }
    }
    printf("文件全部拷贝成功\n");
    return 0;
}

                                                                                                                                                                                           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值