//通過mmap實作多行程拷貝檔案
//
//
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <sys/wait.h>
using namespace std;
int main(int argc,char* argv[])
{
if(argc != 2)
{
cout << "./03_homework_mutiprocess_copy filename" << endl;
return -1;
}
//首先打開源檔案并獲取檔案大小,按照3個行程分配每個行程拷貝的大小
int fd_sor = open(argv[1],O_RDONLY);
off_t filesize = lseek(fd_sor,0,SEEK_END);
lseek(fd_sor,0,SEEK_SET);
int wrsize = filesize / 3 ;//wrsize是前三個行程拷貝的大小
int tlsize = filesize % wrsize;//tlsize是第四個尾行程拷貝的大小
//打開目標檔案并擴展與源檔案大小一致
char tar_buf[64] = {0};
sprintf(tar_buf,"copy_%s",argv[1]);
int fd_tar = open(tar_buf,O_RDWR|O_CREAT|O_TRUNC,0666);
//修改檔案大小與拷貝檔案一致
ftruncate(fd_tar,filesize);
//主行程創建兩個檔案的映射
char* sor_p = (char*)mmap(NULL,filesize,PROT_READ,MAP_SHARED,fd_sor,0);
if(sor_p == MAP_FAILED)
{
cout << "sor mmap err!" << endl;
return -2;
}
close(fd_sor);
char* tar_p = (char*)mmap(NULL,filesize,PROT_READ|PROT_WRITE,MAP_SHARED,fd_tar,0);
if(tar_p == MAP_FAILED)
{
cout << "tar mmap err!" << endl;
return -3;
}
close(fd_tar);
char * temp_tar = tar_p;
char * temp_sor = sor_p;
int id;
for(id = 0;id < 4;id ++)
{
pid_t pid = fork();
if(pid == 0)
break;
}
if(id < 3)
{
//child 0 1 2
cout << "I'm the copying child,my id = "<< id << endl;
//每個子行程進行映射記憶體的拷貝
memcpy(temp_tar+id*wrsize,temp_sor+id*wrsize,wrsize);
}
else if(id == 3)
{
//child 3
cout << "I'm the copying child,my id = "<< id << endl;
//最后一個子行程進行末尾映射記憶體的拷貝
memcpy(temp_tar+id*wrsize,temp_sor+id*wrsize,tlsize);
}
else if(id == 4)
{
//parent
int status;
int ret;
//父行程回收子行程并關閉檔案
while((ret = waitpid(-getpid(),&status,0)) != -1)
{
if(WIFEXITED(status))
{
cout << "Recover child success! " << WEXITSTATUS(status)<< endl;
}
}
//回收子行程后結束,父行程斷開映射
ret = munmap(sor_p,filesize);
if(ret < 0)
{
cout << "munmap err!" << endl;
return -4;
}
ret = munmap(tar_p,filesize);
if(ret < 0)
{
cout << "munmap err!" << endl;
return -5;
}
}
return 0;
}
拷貝出來的檔案能打開,大部分都能運行,但是圖示不正確。我試了網上其他人寫的程式,人家的拷貝出來的就沒問題。我覺得我哪里一定有點問題,但是沒有找到問題在哪。我甚至試了系統的Ctrl c , Ctrl v,考到別的目錄就正常了,這就讓我更疑惑了

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/8109.html
標籤:C++ 語言
上一篇:【求助】大數二進制加法 資料型別改成long long 后無法出結果
下一篇:MATLAB矩陣求特征值
