【问题标题】:shm_open with mmap giving bus error only in one particular machine带有 mmap 的 shm_open 仅在一台特定机器上给出总线错误
【发布时间】: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,会发生什么?

标签: c linux


【解决方案1】:

您正在复制 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");

【讨论】:

  • 噢!与 mmap 或 shm 无关。接得好。 (我可能看到了 mmap/shm 的用法,并假设 OP 知道比超出这个字符串文字更好)。
  • 我改成 strcpy,这次也没有运气.. 给出同样的总线错误。
猜你喜欢
  • 2012-09-18
  • 2023-02-21
  • 1970-01-01
  • 2020-09-20
  • 2014-05-20
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多