目录
步骤1、参数校验check_pram(char* sfile,int argc,int pronum)——源文件,参数数量,进程数量
步骤2、任务切片int blockcur(char* sfile,int pronum)——返回值为任务量
实践课
并发程序开发,大多数时候并发程序相比传统的单进程,执行速度更快,更合理利用资源,效率更好,所以必须了解掌握并发应用开发
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;
}
成功截图