Linux高阶——1102—创建多进程拷贝程序

目录

实践课

eg:使用多进程/多线程分段处理文件

任务:做一个拷贝图片的进程

1、准备工作

步骤1、参数校验check_pram(char* sfile,int argc,int pronum)——源文件,参数数量,进程数量

步骤2、任务切片int blockcur(char* sfile,int pronum)——返回值为任务量

步骤3、主函数main.c

2、进程的创建

1、创建进程

2、copy程序

3、process_create函数

成功截图


实践课

并发程序开发,大多数时候并发程序相比传统的单进程,执行速度更快,更合理利用资源,效率更好,所以必须了解掌握并发应用开发

1、如果一个执行单元得到的cpu越多,那它完成任务的时间越短,多进程可以获得更多的时间片缩减任务完成速度

2、如果是多进程程序,当某个进程因为阻塞挂起放弃时间片,就近原则,会转移到相邻进程,提高cpu使用效率

eg:使用多进程/多线程分段处理文件

在百度网盘上下载文件,多进程下载

1、分段处理,按照进程数量切割任务数量

2、进程任务相同,操作相同,但是文件操作的位置不同

任务:做一个拷贝图片的进程

编写process_copy的程序拷贝一张图片,该程序参数有三个参数——1、jpg1        2、jpg2        3、进程数量

1、准备工作

步骤1、参数校验check_pram(char* sfile,int argc,int pronum)——源文件,参数数量,进程数量

1、验证源文件有效性access("文件名",F_OK)

2、参数数量验证(<3)

3、进程数量验证,进程数量>=缺省值,否则为3,不能大于100

process_copy的参数一般放在main函数中,argv[0]是./process_copy,argv[1]是jpg1,argv[2]是jpg2,argv[3]是pronum

步骤2、任务切片int blockcur(char* sfile,int pronum)——返回值为任务量

1、获取文件大小

int fd=open("a",O_RDWR);        int fsize=lseek(fd,0,SEEF_END);

2、计算任务量

3、如果不能整除,让进程按字节分

步骤3、主函数main.c

1、检验进程数

2、调用check_pram函数,验证参数

3、调用blockcur函数,返回值为任务量

4、调用process_ceate函数

2、进程的创建

多进程创建及拷贝

1、创建进程

父进程(Parent)负责按用户的要求创建和回收子进程,创建完毕,负责回收僵尸子进程

子进程(Child)负责重载拷贝程序

2、copy程序

第一个参数——源文件

第二个参数——目标程序

第三个参数——要拷贝的大小blocksize

第四个参数——偏移量offset

第三个和第四个是字符型,需要使用函数转为整型

open打开源文件和目标文件,源文件文件描述符为sfd,目标文件文件描述符dfd

根据offset来偏移文件读写位置

lseek(sfd,offset,SEEK_SET)

lseek(dfd,offset,SEEK_SET)

使用read(sfd)读取blocksize大小

使用write(dfd)写入到目标文件

读写完毕close()

使用execl函数给子进程重载copy函数,execl("绝对路径/copy","copy","src","dest","blck","offset",NULL)

copy总函数

#include<process_cp.h>

int main(int argc,char** argv)
{
    int sfd,dfd;
    int blck,offset;
    blck=atoi(argv[3]);
    offset=atoi(argv[4]);
    sfd=open(argv[1],O_RDONLY);
    dfd=open(argv[2],O_WRONLY|O_CREAT,0664);
    lseek(sfd,offset,SEEK_SET);
    lseek(dfd,offset,SEEK_SET);

    char buf[blck];
    bzero(buf,sizeof(buf));

    int len;
    len=read(sfd,buf,sizeof(buf));
    write(dfd,buf,len);
    printf("child pid %d,offset %d,blck %d\n",getpid(),offset,blck);
    return 0;
}

3、process_create函数

pron——用户传入的进程数量

#include<process_cp.h>

int process_create(const char* sfile,const char* dfile,int block,int pron)
{
    pid_t pid;
    int i;
    for(i=0;i<pron;i++)
    {
        pid=fork();
        if(pid==0)
        {
            break;
        }   
    }   
    if(pid>0)
    {
        pid_t zpid;
        while((zpid=wait(NULL))!=-1)
        {
            printf("parent %d wait success,zpid %d\n",getpid(),zpid);
        }   
    }   
    else if(pid==0)
    {
        int offset;
        offset=i*block;
        char strblock[512];
        char stroffset[512];
        bzero(strblock,sizeof(strblock));
        bzero(stroffset,sizeof(stroffset));
        sprintf(strblock,"%d",block);
        sprintf(stroffset,"%d",offset);
        execl("/home/colin/20240110/1102/mod/copy","copy",sfile,dfile,strblock,stroffset,NULL);
    }
    else
    {
        perror("fork error");
        exit(0);
    }
    return 0;
}

成功截图

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值