免费注册 查看新帖 |

Chinaunix

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

[C] 关于mmap映射总是出错 怎么回事 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-13 17:43 |只看该作者 |倒序浏览
第一段代码如下:

int main()
{
        int fd;
        int flength = 10;
        char *mapped = NULL;
        fd = open("src.txt", O_RDONLY);

        mapped=(char *)mmap(0,flength,PROT_READ,MAP_PRIVATE,fd,0);
        if( mapped == MAP_FAILED){
                printf("map failed");
                return 0;
        }

        lseek(fd, 5, SEEK_SET);

        mapped = (char *)mmap(mapped, flength, PROT_READ, MAP_PRIVATE, fd, 0);

        printf("out is --->%s\n", mapped);

        munmap(mapped, flength);

        close(fd);

        return 0;
}

src源文件是 1234567890, 我想输出 67890, 可每次都是全部输出, 怎么回事呢?

第二段代码, 1.txt中是1M的文件;
总是段错误, 代码如下:

int main()
{
        int fd;
        char *mapped_mem, * p;
        int flength = 10;


        fd = open("1.txt", O_RDONLY);
       
        int off_set = 0;
       
        for(int i = 0; i<1024; i++)
        {
                mapped_mem = (char *)mmap(mapped_mem, flength, PROT_READ, MAP_PRIVATE, fd, off_set);

                if( mapped_mem == MAP_FAILED){
                          printf("map failed");
                        return 0;
                  }
                off_set += strlen(mapped_mem);
                munmap(mapped_mem, strlen(mapped_mem));
                printf("out is--->%d\n", strlen(mapped_mem));
               
        }

        close(fd);

        return 0;
}

该怎么改呢 这两段代码 多谢指教

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2013-05-13 19:12 |只看该作者
mmap 跟 lseek无关,
第二个应该 strlen 滥用了

论坛徽章:
0
3 [报告]
发表于 2013-05-13 23:56 |只看该作者
为什么是滥用了, 我主要想每次映射一定数量的二进制数据到内存中, 读完之后再映射剩余的一部分, 现在遇到的问题是, 我不知道该怎么读好, 为什么我执行以下代码是段错误呢 请指教 多谢:
int main()
{
        int fd;
        int flength = 10;
        char *mapped = NULL;
        fd = open("src.txt", O_RDONLY);

        mapped=(char *)mmap(0,flength,PROT_READ,MAP_PRIVATE,fd,5);
        printf("out is --->%s\n", mapped);

        munmap(mapped, flength);

        close(fd);

        return 0;
}

这个难道不应该输出 67890吗

回复 2# hellioncu


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2013-05-14 07:59 |只看该作者
aore2010 发表于 2013-05-13 23:56
为什么是滥用了, 我主要想每次映射一定数量的二进制数据到内存中, 读完之后再映射剩余的一部分, 现在遇到的 ...


mmap出来的内存不会给你加 '\0' 结尾,所以你想用 strlen  printf %s等都得自己保证内容中有 '\0'

论坛徽章:
0
5 [报告]
发表于 2013-05-14 14:27 |只看该作者
我现在要读一个几十G的文件, 怎么才能一段一段的读, 知道文件读完呢? 而不是一次将全部文件映射到内存中来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP