我有以下简单的程序来创build共享内存。 但是这是给予的
总线错误(核心转储)
这只发生在一台虚拟机上,我在多台虚拟机中尝试了相同的代码,而在其他所有机器上都正常工作。 但只有在一台机器上,这个问题正在发生。 任何人都可以指出我的问题。 我所有的机器都在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); }
您正在复制50个字节
memcpy((char *)memPtr, "test input.Just copying something\n", 50); /* BTW: ^ this cast is unneeded */
只有36个可用,所以你正在阅读超出字符串文字,这是未定义的行为,这就是为什么它在一台机器上工作,并在另一台机器上失败,这就是未定义行为的行为。
尝试
strcpy((char *) memPtr, "Test input. Just copying something\n");