【发布时间】:2015-06-25 17:05:03
【问题描述】:
我有以下简单的程序来创建共享内存。但这给了
总线错误(核心转储)
这仅在一台虚拟机上发生,我在多个 VM 中尝试了相同的代码,并且在其他所有机器上都可以正常工作。但仅在一台机器上发生此问题。谁能指出我的问题。我所有的机器都在 2.6.32-279.el6.x86_64 上运行。这是内核问题还是应用程序问题?
#include<stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
const char *shpath="/shm_path_for_data";
void *memPtr;
shm_unlink(shpath);
int fd=0;
fd = shm_open(shpath, O_RDWR|O_CREAT|O_EXCL, 0777);
if(fd<0) {
printf("shm_open failed\n");
return 1;
}
if((ftruncate(fd, getpagesize())) <0) {
printf("Ftruncate failed\n");
return 1;
}
memPtr = mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if(memPtr == MAP_FAILED) {
return 1;
}
strcpy((char *)memPtr, "test input.Just copying something\n");
printf("mapped out: %s\n", (char *)memPtr);
}
【问题讨论】:
-
很好奇,为什么要投到
(char *)? -
导致 SIGSEGV 的错误代码行是什么?如果你不知道,那么请在 gdb 下运行你的代码来找出答案。
-
@JonathonReinhart 我们都错过了,看看我的回答。
-
当我尝试访问内存区域时发生总线错误。所以这里它发生在 memcpy 本身上。我也试过 strcpy 。但是当我尝试在内存区域上写入时,总线错误发生在同一行
-
如果您设置
MAP_ANONYMOUS并将-1传递为fd,而不是shm,会发生什么?