gpt4 book ai didi

c - 为什么 remap_file_pages() 在此示例中失败?

转载 作者:IT王子 更新时间:2023-10-29 01:19:38 26 4
gpt4 key购买 nike

以下 C 代码说明了我在 Linux 2.6.30.5-43.fc11.x86_64 上遇到的问题:

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
char buf[1024];
void *base;
int fd;
size_t pagesz = sysconf(_SC_PAGE_SIZE);

fd = open("<some file, at least 4*pagesz in length>", O_RDONLY);
if (fd < 0) {
perror("open");
return 1;
}

base = mmap(0, 4*pagesz, PROT_READ, MAP_SHARED, fd, 0);
if (base < 0) {
perror("mmap");
close(fd);
return 1;
}

memcpy(buf, (char*)base + 2*pagesz, 1024);

if (remap_file_pages(base, pagesz, 0, 2, 0) < 0) {
perror("remap_file_pages");
munmap(base, 4*pagesz);
close(fd);
return 1;
}

printf("%d\n", memcmp(buf, base, 1024));

munmap(base, 4*pagesz);
close(fd);
return 0;
}

这总是失败,remap_file_pages() 返回 -1 并且 errno 设置为 EINVAL。查看内核源代码,我可以在 remap_file_pages() 中看到它可能会失败的所有条件,但它们似乎都不适用于我的示例。怎么回事?

最佳答案

这是由于打开文件 O_RDONLY 引起的。如果将打开模式更改为 O_RDWR,它会起作用(即使 mmap() 仍然仅指定 PROT_READ)。

do_mmap_pgoff 中的这段代码是根本原因 - 它仅在打开文件进行写入时将 vma 标记为 VM_SHARED:

vm_flags |= VM_SHARED | VM_MAYSHARE;
if (!(file->f_mode & FMODE_WRITE))
vm_flags &= ~(VM_MAYWRITE | VM_SHARED);

所以在 remap_file_pages() 中,您在第一次检查时失败了:

if (!vma || !(vma->vm_flags & VM_SHARED))
goto out;

关于c - 为什么 remap_file_pages() 在此示例中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com