免费注册 查看新帖 |

Chinaunix

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

内存映射产生段错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-11 17:36 |只看该作者 |倒序浏览
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>

int main()
{
    int fd = 0;
    size_t len = 0;
    void* abc = NULL;
    size_t empLen = 0;
    const char* buf = "abcdefghij";
    int i = 0;
    while(i < 100)
    {
        fd = open("./b.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);

        ftruncate(fd, len += 1024);
        abc = mmap(NULL, 1024, PROT_WRITE | PROT_READ, MAP_SHARED, fd, len-1024);
        if(abc == NULL)
        {
            printf("error");
            break;
        }
        empLen = 1024;

        while(1)
        {
            if(10 <= empLen)
            {
                memcpy((char*)abc + 1024 - empLen, buf, 10);
                empLen -= 10;
            }
            else
            {
                memcpy((char*)abc + 1024 - empLen, buf, empLen);
                empLen = 0;
                break;
            }
        }
        msync(abc, 1024, MS_SYNC);
        munmap(abc, 1024);
        close(fd);
        i += 1;
    }
    if(abc != NULL)
    {
        munmap(abc, 1024);
    }
    close(fd);
}
今天好像代码功能不能用,大家帮忙看看这段程序,那个地方出了问题?
产生”段错误“发生在红色的那一行

[ 本帖最后由 onmeiei 于 2009-9-11 17:39 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-11 17:37 |只看该作者
自己顶

论坛徽章:
0
3 [报告]
发表于 2009-09-12 14:38 |只看该作者
找到问题了。。。offset写错了,应该是4096的倍数

论坛徽章:
0
4 [报告]
发表于 2009-09-12 15:24 |只看该作者
mmap只能是page的整数倍
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP