ContextBusfehler nach Mmap Erfolg
- Linux 4.4.0-57-generiC# 78-Ubuntu SMP Fr 9. Dezember 23.50.32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
- Französisch locale
-Code
#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;
}
Produktion
$ gcc -W -Wall -std=c11 src/org/hpms/filemap/BusError.c -o bin/BusError
(no warning, no error)
Execution
$ 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)
'typedef Byte bytes_t' ist missleading. Beachten Sie auch, dass POSIX Namen reserviert, die mit '_t' enden; Du darfst sie nicht benutzen. Wenn Sie Bytes benötigen, verwenden Sie 'unsigned char' direkt und' typedef' verdecken keine Aliases wie diese. Wenn Sie 8-Bit-Typen verwenden möchten, verwenden Sie den Typ mit fester Breite "uint8_t". Sagte, dass: mit fast 10k rep, sollten Sie wissen [fragen] und eine [mcve] zur Verfügung stellen! Was geben die Funktionen zurück? Wie wäre es mit Fehlern? ... – Olaf