O_DIRECT读写出错

nmzrl 2006-08-31 09:16:59
我用/dev/mem的mmap得到一段内存,然后通过O_DIRECT方式读一个文件的内容,可是老出现错误:Bad address,请问这是怎么回事,有何解决办法呀
另外:如果内存是从上层直接申请(malloc(length)),就没问题
解化代码如下:
int main()
{
int length = 4096;
if((fd = open("/dev/mem",O_RDWR,S_IRUSR | S_IWUSR)) != -1)
{
v = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED,fd,400M);
//v = malloc(length)/*直接申请*/
if ( (int)v == -1)
{
exit(1);
}
} else exit(1);
memset(v,'a', length);
int m_fd = open("a", O_CREAT | O_RDWR | O_DIRECT);
if(!m_fd)exit(1);
int pagesize=getpagesize();/*页对其*/
char* alignedbuff=(char*)((((int unsigned)v+pagesize-1)/pagesize)*pagesize);
int ret = write(m_fd, alignedbuff, length);
if (ret != length)
printf("Error at write(): %s\n",strerror(errno));
return 0;
}
...全文
429 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nmzrl 2006-08-31
  • 打赏
  • 举报
回复

谢谢您的指导,400M是我为了让大家看得更清楚些写的
我是用root用户运行的,不过这些都不是主要问题
问题是我在程序中直接申请的内存可以进行O_DIRECT操作,而通过mmap得到的却不行,这是为什么
fytzzh 2006-08-31
  • 打赏
  • 举报
回复
1,你需要以root权限运行。
2, v = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED,fd,400M); ===>400M???能这样写么???!!!
3,if ( (int)v == -1) ===》一般都这样写if (v == (void*)-1)
4, memset(v,'a', length);====> memset(v, 'a', length-1); a[length-1]='\0';
5, int m_fd = open("a", O_CREAT | O_RDWR | O_DIRECT);===>open("./a",... ...)修改为相对路径或绝对路径
nmzrl 2006-08-31
  • 打赏
  • 举报
回复
高手们,近来指点指点吧!!

23,217

社区成员

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

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