是否可以将源文件映射到目标文件的mmaped区域,作为将源复制到目标的方法?我尝试了一个简单的实现(下面),但它不起作用..
int main(int argc, char *argv[])
{
struct stat ss;
int src = open(argv[1], O_RDONLY);
fstat(src, &ss);
int dest = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, ss.st_mode);
void *dest_addr = mmap(NULL, ss.st_size, PROT_WRITE, MAP_SHARED, dest, 0);
printf("dest is: %x\n", dest_addr);
void *src_addr = mmap(dest_addr, ss.st_size, PROT_READ, MAP_PRIVATE | MAP_FIXED, src, 0);
printf("src is: %x\n", src_addr);
if (munmap(dest_addr, ss.st_size))
printf("munmap failed");
if (munmap(src_addr, ss.st_size))
printf("munmap failed");
}
上面将源“映射”到目标mmap上,但是这并没有像希望的那样直接到达实际文件。我只是天真?
答案 0 :(得分:3)
将两个文件映射到同一个内存区域是有问题的。这个内存的内容应该是什么,来自第一个文件或第二个文件的数据,还是混合?这不起作用。
您可以做的是将两个文件和memcpy
从一个映射区域映射到另一个映射区域。但请注意,首先创建文件并设置其长度是个好主意,否则mmap
可能会返回SIGBUS
(请参阅文档)。
SIGBUS尝试访问没有的部分缓冲区 对应于文件(例如,超出文件末尾, 包括另一个进程截断文件的情况。)