【发布时间】:2015-07-17 14:33:49
【问题描述】:
我需要将 file1 的上下文复制到 file2。这是我的文件 文件1
My name is John
文件2
I like water
所以我的 resilt 应该是 file2
I like water
My name is John
为此,我必须使用 mmap 和 memcpy。所以在这里我做什么
首先我打开两个文件
int da_open(const char *name){
int dskr;
dskr = open( name, O_RDWR );
if( dskr == -1 ){
perror( name );
exit(1);
}
printf( "dskr1 = %d\n", dskr );
return dskr;
}
然后我映射我的文件
void *da_mmap1( int d, int size ){
void *a = NULL;
a = mmap( NULL, size, PROT_WRITE | PROT_READ, MAP_SHARED, d, 0 );
if( a == MAP_FAILED ){
perror( "mmap failed" );
abort();
}
return a;
}
这是我的 memcpy
void *da_memcpy(void *str1, const void *str2, size_t n){
return memcpy(str1, str2, n);
}
和我的主要
int main(int argc, char *argv[] ){
struct stat fileStat;
int st;
int d1;
int d2;
void *r = NULL;
void *w = NULL;
if(argc == 3){
d1 = da_open(argv[1]);
d2 = da_open(argv[2]);
r = da_mmap1(d1, SIZE);
w = da_mmap1(d2, SIZE);
st = stat(r, &fileStat);
printf("Tik skaitoma: %d\n", fileStat.st_size);
da_memcpy(w,r,fileStat.st_size);
da_munamp(r, SIZE);
da_munamp(w, SIZE);
da_close(d1);
da_close(d2);
}
return 0;
}
但在此之后我的文件 2 看起来像这样
My name i
为什么?怎么了?
【问题讨论】:
-
帮自己一个忙,打开所有编译器警告(
-Wall -Wextra -pedantic用于 gcc)。然后作为调试的第一步:修复代码,直到不再发出警告。 -
对
stat()的调用也错过了错误处理。 -
“大小”应该是一个计算值,每个文件都不同。对于输入文件,stat() 将告诉您制作 mmap 有多大。对于输出文件, stat() 会告诉你文件的原始大小。输出 mmap 需要足够大以包含输入文件的组合长度 + 输出文件的原始长度。将输入文件中的数据复制到输出文件时,输出复制需要在输出文件中已有数据之后开始。都是文本文件,所以建议在插入输入文件内容之前也插入一个空格
标签: c memcpy file-mapping