【发布时间】:2017-02-12 20:48:58
【问题描述】:
创建了一个修改字节文件的简单 mmap 程序。 在一个简单/小文件上以 root 身份运行它,出现错误
# ./a.out tmp.txt 92
fd=3
mmap: Permission denied
代码sn-p
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int main(int argc, char *argv[]) {
int fd = open(argv[1], O_WRONLY);
printf("fd=%d\n", fd);
char *p = mmap(0, 0x1000, PROT_WRITE, MAP_SHARED, fd, 0);
if (p == MAP_FAILED) {
perror ("mmap");
return 1;
}
p[0] = 0xde;
close(fd);
return 0;
}
想知道出了什么问题。谢谢。
更新1
修正了代码 sn-p 中的一个错字,我的意思是在那里使用PROT_WRITE。
【问题讨论】:
-
感谢@mch 指出,我使用
PROT_WRITE更正了代码sn-p,但得到了同样的结果。 -
文件大小真的是
0x1000字节吗?那是 4096 字节。 -
大小实际上是92字节,使用
0x1000因为它是我Linux上的页面大小 -
tmp.txt 有哪些所有者/用户和权限,您以什么用户身份运行该程序?
ls -l tmp.txt; id