c - mmap 成功后出现总线错误

标签 c linux mmap file-mapping

上下文

  • Linux 4.4.0-57-generic#78-Ubuntu SMP Fri Dec 9 23:50:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
  • 法语地区

代码

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>

int main() {
   int fd = open( "/tmp/mapped.bin", O_CREAT|O_RDWR|O_SYNC, 0666 );
   perror("open");
   unsigned char * dst =
      (unsigned char *)mmap(
         NULL, 64*1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0 );
   perror("mmap");
   static unsigned char src[] = { 1, 3, 5, 7 };
   printf("memcpy( %p, {%d,%d,%d,%d}, %zd )\n", dst, src[0], src[1], src[2], src[3], sizeof(src));
   memcpy(dst, src, sizeof(src));
   perror("memcpy");
   return 0;
}

生产

$ gcc -W -Wall -std=c11 src/org/hpms/filemap/BusError.c -o bin/BusError
(no warning, no error)

执行

$ bin/BusError
open: Success
mmap: Success
memcpy( 0x7f51291fe000, {1,3,5,7}, 4 )
Erreur du bus

gdb

(gdb) run
Starting program: /home/aubin/Dev/Java/2017/org.hpms.filemap/bin/BusError
open: Success
mmap: Success
memcpy( 0x7ffff7fe6000, {1,3,5,7}, 4 )

Program received signal SIGBUS, Bus error.
0x00000000004005ac in main () at src/org/hpms/filemap/BusError.c:15
15     memcpy(dst, src, sizeof(src));
(gdb)

最佳答案

如果您访问文件外的映射内存,您将获得 SIGBUS。换句话说,如果要写入 4 个字节,则文件至少需要 4 个字节大。

在您的示例中,您可以使用 ftruncate 解决问题:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

int main() {
   int fd = open( "/tmp/mapped.bin", O_CREAT|O_RDWR|O_SYNC, 0666 );
   perror("open");
   unsigned char * dst =
      (unsigned char *)mmap(
         NULL, 64*1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0 );
   perror("mmap");
   static unsigned char src[] = { 1, 3, 5, 7 };
   ftruncate(fd, sizeof src);
   perror("ftruncate");
   printf("memcpy( %p, {%d,%d,%d,%d}, %zd )\n", dst, src[0], src[1], src[2], src[3], sizeof(src));
   memcpy(dst, src, sizeof(src));
   perror("memcpy");
   return 0;
}

关于c - mmap 成功后出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249695/

相关文章:

c - 如何遍历目录并对每个文件执行任务

c - 嵌套的 for 循环似乎由于某种原因单独执行

linux - 如何安全地抑制命令输出?

linux - 如何在 Linux 上记录进程的 CPU、内存、带宽?

c - mmap 保护标志对进程间共享的影响

c - HM-10 和 Arduino - 发送没有代码行结尾的 AT 命令

c - 如何在 YACC 语法中回显输入文本?

c - 为什么从数据集的/dev 源成功读取 errno?

c++ - 如何使用系统调用将 int 转换为 char*?

c++ - IPC 通过 mmap 文件 : should atomics and/or volatile be used?