mmap出现Permission denied

liyi54188 2011-07-26 11:45:07
为什么会出现:fail to mmap:Permission denied
这个需要什么权限啊,root?

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
int fd;
char *buf;
struct stat statbuf;
if(stat("test.txt", &statbuf) == -1)
{
perror("fail to get stat");
exit(1);
}
fd = open("test.txt", O_WRONLY);
if(fd == -1)
{
perror("fail to open");
exit(1);
}
buf = (char *)mmap(NULL, statbuf.st_size, PROT_WRITE, MAP_SHARED, fd, 0);
if(buf == MAP_FAILED)
{
perror("fail to mmap");
exit(1);
}
strcpy(buf, "China beijing");
if(munmap(buf, statbuf.st_size) == -1)
{
perror("fail to munmap");
exit(1);
}
close(fd);
return 0;
}
...全文
1953 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
imGala 2013-08-29
  • 打赏
  • 举报
回复
我知道问题处在哪里啦 fd = open("test.txt", O_RDWR | O_CREAT); 的第二个参数O_RDWR | O_CREAT 和 buf = (char *)mmap(NULL, MAX_SIZE, PROT_WRITE, MAP_SHARED, fd, 0); 的第三个参数PROT_WRITE 不对应,应该对应上,不然冲突 对的话给我分啊
追_逐 2013-08-28
  • 打赏
  • 举报
回复
引用 10 楼 justkk 的回复:
open("test.txt", O_RDWR); 这样呢?
我把你的代码用10楼的这个方法改了之后就OK了,不过使用statbuf.st_size 作为映射内存空间大小真的不是个好想法。如果那个文件大小为0,就只能映射0个字节了。
空的 2013-07-30
  • 打赏
  • 举报
回复
mmap()必须以PAGE_SIZE()为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以PAGE_SIZE的倍数大小进行映射。 这个?
骑自行车 2013-07-30
  • 打赏
  • 举报
回复
引用 11 楼 liyi54188 的回复:
我的test.txt的权限是777,改成open("test.txt", O_RDWR);还是不行啊,报segmentation fault,怎么都不对,可能是系统有什么要设置吧
segmentation fault 是正常情况吧
骑自行车 2013-07-30
  • 打赏
  • 举报
回复
fd = open("test.txt", O_WRONLY); 改成 O_RDWR 试试
prohibit 2013-04-10
  • 打赏
  • 举报
回复
//这样就行,这取决于test.txt文件中原始数据的大小,即重新拷贝的字符数小于等于原有字符数
fd = open("test.txt", O_RDWR | O_CREAT);
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#define MAX_SIZE (32)

int main(void)
{
	int fd;
	char *buf;
	struct stat statbuf;

	if(stat("test.txt", &statbuf) == -1)
	{
		perror("fail to get stat");
		exit(1);
	}

	fd = open("test.txt", O_RDWR | O_CREAT);
	if(fd == -1)
	{
		perror("fail to open");
		exit(1);
	}

	// test.txt文件已有内容小于MAX_SIZE时,扩大存储的字符数
	if (ftruncate(fd, MAX_SIZE) != 0)
	{
		perror("fail to ftruncate");
		exit(1);
	}

	buf = (char *)mmap(NULL, MAX_SIZE, PROT_WRITE, MAP_SHARED, fd, 0);
	if(buf == MAP_FAILED)
	{
		perror("fail to mmap");
		exit(1);
	}

	strcpy(buf, "China beijing");
	if(munmap(buf, MAX_SIZE) == -1)
	{
		perror("fail to munmap");
		exit(1);
	}

	close(fd);
	return 0;
}

qq120848369 2012-04-02
  • 打赏
  • 举报
回复
创建的时候没指定文件的mode,当然没权限。
zmkkobe 2012-04-02
  • 打赏
  • 举报
回复
我也这样的错误啊?谁来帮忙啊
liyi54188 2011-08-01
  • 打赏
  • 举报
回复
我的test.txt的权限是777,改成open("test.txt", O_RDWR);还是不行啊,报segmentation fault,怎么都不对,可能是系统有什么要设置吧
justkk 2011-07-28
  • 打赏
  • 举报
回复
open("test.txt", O_RDWR);
这样呢?
squiffy 2011-07-28
  • 打赏
  • 举报
回复
可能我搞错了,

S_IREAD | S_IWRITE的时候,前面必须带O_CREATE选项。


可能是你的test.txt的权限的原因吧?权限调整成777

然后再按照你原来的方式mmap还不行吗
liyi54188 2011-07-27
  • 打赏
  • 举报
回复
我重新创建了个test.txt,权限为777,再运行出现fail to mmap: Invalid argument
O_RDONLY | O_BINARY, S_IREAD | S_IWRITE这后面3个是什么啊?
linux不是不分二进制吗O_BINARY?加了报错找不到O_BINARY S_IREAD S_IWRITE
squiffy 2011-07-27
  • 打赏
  • 举报
回复
fd = open("test.txt", O_WRONLY);
改成:

fd = open("test.txt", O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);

试试?

你确定一下test.txt不会带只读属性吧?
liyi54188 2011-07-27
  • 打赏
  • 举报
回复
这样也不行啊,出现了bash:/proc/sys/vm/mmap_min_addr:permission denied
justkk 2011-07-26
  • 打赏
  • 举报
回复
表示奇怪,占位
沭水河畔 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liyi54188 的回复:]

屏幕输出应该没什么,我就想看看运行后能否修改test.txt的内容,但是出现了fail to mmap:Permission denied
[/Quote]
Try this:
ubuntu下编译C后执行过程中出现mmap:permission denied
解决方法echo 0 > /proc/sys/vm/mmap_min_addr
liyi54188 2011-07-26
  • 打赏
  • 举报
回复
屏幕输出应该没什么,我就想看看运行后能否修改test.txt的内容,但是出现了fail to mmap:Permission denied
justkk 2011-07-26
  • 打赏
  • 举报
回复
那你这个程序运行时的屏幕输出是什么?
liyi54188 2011-07-26
  • 打赏
  • 举报
回复
有没人知道原因啊,自己顶下

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧