免费注册 查看新帖 |

Chinaunix

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

关于mmap的问题.初学 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-21 15:01 |只看该作者 |倒序浏览
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>

typedef struct{
        char name[4];
        int age;
}people;

int main(int argc, char *argv[])
{
        int fd, i;
        people *p_map;
        char temp;
        fd = open( argv[1], O_CREAT|O_RDWR|O_TRUNC, 00777);
        lseek( fd, sizeof(people)*5-1, SEEK_SET);
        write( fd, "", 1 );
        p_map = ( people* )mmap( NULL, sizeof(people)*10, PROT_READ|PROT_WRITE,
                        MAP_SHARED, fd, 0 );
        close( fd );
        temp = 'a';
        for ( i = 0; i<10; ++i )
        {
                temp += 1;
                memcpy( (*(p_map + i)).name, &temp, 2 );
                ( *(p_map + i) ).age = 20 + i;
        }
        printf( "initialize over \n" );
        sleep( 10 );
        munmap( p_map, sizeof(people)*10 );
        printf( "nmap ok \n" );
        return 0;
}
为什么只存储了五个结构,书上说"首先打开或创建一个文件,并把文件的长度设置为5个people结构大小.然后从mmap()的返回地址开始,设置了10个people结构."
请问是哪一句设置文件长度了,是lseek吗. 文件新创建时长度不是零吗.

论坛徽章:
0
2 [报告]
发表于 2006-03-21 15:47 |只看该作者
lseek在读文件内容时可以使用。
无论以何种方式打开文件,lseek都可以在文件中寻找到任意的位置。

lseek(int filedes, off_t offset, int whence);
如果 whence 是 SEEK_SET,文件偏移量将被设置为 offset。(偏移量用于表明文件开始处到文件当前位置的字节数)
就是说sizeof(people)*5-1是偏移量,不是长度。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2006-03-21 15:52 |只看该作者
lseek这个函数我会用..
但我不知道为什么此处加上lseek( fd, sizeof(people)*5-1, SEEK_SET);
就只存储五个单位.而换成lseek( fd, sizeof(people)*10-1, SEEK_SET);就能存储10个单位了.

论坛徽章:
0
4 [报告]
发表于 2006-03-21 16:16 |只看该作者
lseek 再 write,文件长度就确定了...

论坛徽章:
0
5 [报告]
发表于 2006-03-21 16:24 |只看该作者
用filelength(fd)来得到文件的长度

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2006-03-21 16:30 |只看该作者
终于明白了..太感谢以上几位了.

论坛徽章:
0
7 [报告]
发表于 2006-03-21 17:37 |只看该作者
lseek + write 得到一个 sparse 文件,一个 APUE 提到的 trick
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP