昨天练习多进程,写了多进程拷贝的代码,在此记录下。
多进程拷贝就是用多个进程对同一篇文档进行拷贝,若文档有len字节,则每个字节只需要拷贝
len/n个字节,但并不一定完全整除,我们只要让最后一个子进程负责剩余的字节就好。
因为进程之间是以时间片轮转的方式抢占CPU,所以只是理论上的比单进程快,在此只是作为练习。
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<stdlib.h>
#include<sys/fcntl.h>
#include<sys/stat.h>
int main(void)
{
pid_t pid;
int fd=open("/home/ubuntu/text/a.txt",O_RDWR);//用读写的方式打开文档
if(fd == -1)//若打开失败,打印错误。
{
perror("open_fd error:");
exit(1);
}
struct stat statbuff;
int set=stat("/home/ubuntu/text/a.txt",&statbuff);//将inode节点信息存储在statbuff
int num=statbuff.st_size;//文件大小
if(set == -1)//发生错误打印
{
perror("stat error:");
exit(1);
}
int fd_1=open("/home/ubuntu/text/b.txt",O_RDWR|O_CREAT|O_TRUNC,0644);
ftruncate(fd_1,statbuff.st_size);//将文件大小设为statbuff.st_size
if(fd_1 == -1){//出错打印错误信息
perror("open_fd_1 error:");
exit(1);
}
char *mm=mmap(NULL,statbuff.st_size,PROT_READ,MAP_SHARED,fd,0);//mmap建立映射区
if(mm == MAP_FAILED){//发生错误打印错误信息
perror("mm_mmap error:");
exit(1);
}
close(fd);//关闭文件
char *mm_1=mmap(NULL,statbuff.st_size,PROT_WRITE,MAP_SHARED,fd_1,0);//mmap建立映射区
if(mm_1 == MAP_FAILED)//出错打印错误信息
{
perror("mm_1_mmap error:");
exit(1);
}
close(fd_1);//关闭文件
int i;
for(i=0;i<5;i++){//循环创建子进程
pid=fork();
if(pid == -1){
perror("fork error:");
exit(1);
}
else if(pid == 0)
{
if(i!=4)
{
memcpy(mm_1+(statbuff.st_size/5)*i,mm+(statbuff.st_size/5)*i,statbuff.st_size/5);//子进程进行文档拷贝
}
else{
memcpy(mm_1+(statbuff.st_size/5)*i,mm+(statbuff.st_size/5)*i,num-(statbuff.st_size/5)*i);//最后一个子进程收尾
}
break;
}
}
int a=munmap(mm,num);//关闭mm指向的映射区
if(a == -1){//出错打印出错信息
perror("munmap_mm error:");
exit(1);
}
int b=munmap(mm_1,num);//关闭mm_1指向的映射区
if(b == -1){//出错打印出错信息
perror("munmap_mm_1 error:");
exit(1);
}
pid_t vis=0;
if(pid>0){//回收所有子进程
while(vis!=-1){
vis=wait(NULL);
}
}
return 0;
}