免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2995 | 回复: 13
打印 上一主题 下一主题

the question of mmap [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-27 13:19 |只看该作者 |倒序浏览
#include<sys/mman.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
int fd=open("/myhome/study/c/1468/ttt",O_RDWR);
char *p=mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

printf("%s\n",p);
char pp[100]="bianlizhi";
strcpy(p,pp);
printf("%s\n",p);
return 0;
}

ttt 中内容为12345

the result:
[root@localhost 1468]# ./a.out
12345

bianlizhi
[root@localhost 1468]# cat ttt
bianli[root@localhost 1468]#
WHY??

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-09-27 13:21 |只看该作者
mmap 不能改变文件的长度。
原来是多长,那还是多长。
像你这种情况,没给你段错误就不错了。

论坛徽章:
0
3 [报告]
发表于 2007-09-27 13:34 |只看该作者
thank you ..
我打开的是一个阻塞的设备(用cat /dev/simpler 和echo "aaa"> /dev/simpler测试是正常的)但是好像用上面的方法就不能使
读继续执行,WHY?
static struct file_operations simple_remap_ops = {
        .owner   = THIS_MODULE,
        .open    = simple_open,
        .release = simple_release,
        .mmap    = simple_remap_mmap,
        .read   =sleepy_read,
        .write=sleepy_write,
};


static DECLARE_WAIT_QUEUE_HEAD(wq);
static int flag=0;

ssize_t sleepy_read(struct file *filp,char __user *buf,size_t count,loff_t *pos)
{
printk("I am in sleeyp_read,going to sleep\n");
wait_event_interruptible(wq,flag!=0);
flag=0;
printk("wake up\n");
return 0;
}

ssize_t sleepy_write(struct file *filp,const char __user *buf,size_t count,loff_t *pos)
{
printk("I am in sleepy_write\n");
flag=1;
wake_up_interruptible(&wq);

return count;
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2007-09-27 13:38 |只看该作者
这下我真的有些听不懂了~

论坛徽章:
0
5 [报告]
发表于 2007-09-27 14:17 |只看该作者
原帖由 flw 于 2007-9-27 13:21 发表
mmap 不能改变文件的长度。
原来是多长,那还是多长。
像你这种情况,没给你段错误就不错了。

一般是访问映射区所在页外的内存才会有段错误吧。

论坛徽章:
0
6 [报告]
发表于 2007-09-27 16:32 |只看该作者
不好意思,是我没说清楚..
是LLD3的一个例子改的,
建立虚拟设备/dev/simpler,,他是阻塞的,例如你先用c
cat 读,他会阻塞,当你用echo写入后,读的进程就不阻塞了..
我想用mmap映射设备,然后写入设备,应该和echo写入一样啊,,但是实际上驱动中的sleepy_write()并没有被执行.....WHY?

论坛徽章:
0
7 [报告]
发表于 2007-09-28 12:53 |只看该作者
mmap不同于read/write。
mmap不会隐含调用read/write方法。

论坛徽章:
0
8 [报告]
发表于 2007-09-28 18:43 |只看该作者
JohnBull  能否解释的详细点呢?
如果mmap不会隐含调用read/write方法,那么我映射设备不是没什么用了吗?

论坛徽章:
0
9 [报告]
发表于 2007-09-28 19:25 |只看该作者
直接使用指针读写呀,mmap就是为了避免read/write这些操作的

论坛徽章:
0
10 [报告]
发表于 2007-09-28 19:30 |只看该作者
楼上的没理解我的意思,直接读写设备好象不能调用驱动里的read和write方法.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP