我尝试使用shm_open和mmap共享内存。 但是,每当我尝试写入该内存,我得到总线错误。 最简单的例子代码如下。 这里有什么问题,如何解决?
#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
之前调用ftruncate
。 (如果你的代码有错误检查,这将是更容易弄清楚。)