【问题标题】:Bus Error when writing to mmaped data写入映射数据时出现总线错误
【发布时间】:2017-02-17 17:44:36
【问题描述】:

上学期我第一次做这个项目时,代码运行良好。现在,当正在写入要在进程之间共享的 mmapped 内存时出现总线错误,我不确定为什么它不再工作了。

Account_Info *mapData()
{
    int fd;
    //open/create file with read and write permission and check return value
    if ((fd = open("accounts", O_RDWR|O_CREAT, 0644)) == -1)
    {
            perror("Unable to open account list file.");
            exit(0);
    }

    //map data to be shared with different processes
    Account_Info *accounts = mmap((void*)0, (size_t) 100*(sizeof(Account_Info)), PROT_WRITE,
    MAP_SHARED, fd, 0);

    int count= 0;

    //loop to initialize values of Account_Info struct
    while (count != 20)
    {
            //bus error occurs here
            accounts[count].CurrBalance= 0;
            accounts[count].flag = 0;
            int i = 0;
            while (i != 100)
            {
                    //place NULL terminator into each element of AccName
                    accounts[count].AccName[i]= '\0';
                    i++;
            }

            count++;
    }

    close(fd);
    return accounts;
}

【问题讨论】:

    标签: c shared-memory mmap bus-error


    【解决方案1】:

    使用 mmap 的 SIGBUS 的记录原因是

    试图访问与文件不对应的缓冲区部分(例如,超出文件末尾,包括另一个进程截断文件的情况)。

    我的猜测是 accounts 文件不存在,所以 openO_CREAT 创建了它。但它的大小为零,因此任何通过映射读取或写入的尝试都会出错。您需要用足够的零(或其他内容)填充文件以覆盖映射,例如使用ftruncate

    【讨论】:

      【解决方案2】:

      如果您尝试写入文件的映射区域,您将收到SIGBUS

      很有可能您的后备存储文件accounts 被截断/太短。 (例如)如果文件有 10 个结构条目的空间并且您写入第 11 个,您将得到SIGBUS

      执行fstat 以获取st_size 并将其与您提供给mmap 的长度参数进行比较

      在执行mmap之前,您可能需要考虑使用ftruncate 来扩展文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        相关资源
        最近更新 更多