Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mmap成功后发生总线错误_C_Linux_Mmap_File Mapping - Fatal编程技术网

C mmap成功后发生总线错误

C mmap成功后发生总线错误,c,linux,mmap,file-mapping,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( "/tm

上下文

  • 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)

如果访问文件外部的mmaped内存,将获得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;
}
#包括
#包括
#包括
#包括
#包括
int main(){
int fd=open(“/tmp/mapped.bin”,O|u CREAT | O|u RDWR | O|u SYNC,0666);
佩罗(“公开”);
无符号字符*dst=
(未签名字符*)mmap(
NULL,64*1024,保护读写,映射共享,fd,0);
佩罗尔(“mmap”);
静态无符号字符src[]={1,3,5,7};
ftruncate(fd,src尺寸);
perror(“ftruncate”);
printf(“memcpy(%p,{%d,%d,%d},%zd)\n”、dst、src[0]、src[1]、src[2]、src[3]、sizeof(src));
memcpy(dst、src、sizeof(src));
perror(“memcpy”);
返回0;
}

typedef byte bytes\u t
误码。还要注意,POSIX保留以
\u t
结尾的名称;你不能使用它们。如果需要字节,请直接使用
unsigned char
,不要像那样模糊别名。如果需要8位类型,请使用固定宽度类型
uint8\u t
。他说:拥有近10k的销售代表,你应该知道并提供一个!函数返回什么?错误呢。。。如果可以的话,您真的应该将文件大小设置为4K的倍数,也就是页面大小。它简化了所有的内存管理。