[英]Unable to access data structure after `open()` and `mmap()` - Bus Error
[英]Bus error after mmap success
上下文
碼
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.