【问题标题】:Bus error when trying to write in shared memory尝试写入共享内存时出现总线错误
【发布时间】:2012-07-22 12:59:35
【问题描述】:

我尝试通过 shm_openmmap 使用共享内存。但是,每当我尝试写入该内存时,都会出现总线错误。下面给出了极简示例代码。这里有什么问题,如何解决?

#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// compile with -lrt

char fname[64];
int fd;

int main()
{
    int * sm;
    sprintf( fname, "%d_%u", 4, 4 ); 

    if ((fd = shm_open(fname, O_CREAT | O_RDWR, 0777)) == -1)
    {        
        perror(NULL);
        return 0;
    }
    sm = (int*)mmap(0, (size_t)4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, 
      fd, 0);
    printf( "Now trying to see if it works!\n" );
    sm[0] = 42;
    printf( "%d, %d!\n", sm[0], sm[1] );

    return 0;
}

我得到的输出如下

Now trying to see if it works!
Bus error

【问题讨论】:

  • 您需要检查mmap 是否返回MAP_FAILED,如果是,请咨询errno 找出原因。 (另外,您不会尝试写入长度为零的共享对象,对吗?mmapmmap 区域的写入都不能放大对象。)

标签: c++ c linux x86-64


【解决方案1】:

新创建的对象的大小为零。您不能通过映射或写入其映射来更改对象的大小。您可能需要在mmap 之前调用ftruncate。 (如果您的代码有错误检查,这将更容易弄清楚。)

【讨论】:

  • 在这种情况下,错误检查并不重要,因为 mmap 会愉快地映射一个零长度文件,只要长度与页面对齐。
猜你喜欢
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2012-12-06
相关资源
最近更新 更多