2010-11-22 5 views
3

J'ai un programme qui doit utiliser mmf pour mapper une image ppm en mémoire et ensuite, chaque enfant, doit inverser ligne par ligne le MMF. Il dit: "la version MMF devra d'abord créer une copie de l'image (et la renommer en nom de fichier du destin) puis exécuter l'inversion sur cette copie." Les sémaphores sont aussi dans le bon ordre et selon la mission. De cela, j'ai codé et cela me donne la sortie correcte mais cela arrive: S. Je ne comprends pas pourquoi, mais il est clairement pas droit:Problèmes avec les fichiers mappés en mémoire avec les processus père et enfant

(...) 
Inverting row... 
Done || 
Inverting row... 
Done || 
Cleaning up... 
Closing file pointers. 
*** glibc detected *** ./MMF_inverter: double free or corruption (!prev): 0x093a0170 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x28e591] 
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x28fde8] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x292ecd] 
/lib/tls/i686/cmov/libc.so.6(fclose+0x14a)[0x27eaaa] 
./MMF_inverter[0x80497d5] 
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x239bd6] 
./MMF_inverter[0x8048d01] 
======= Memory map: ======== 
00110000-00125000 r-xp 00000000 08:05 1569987 /lib/tls/i686/cmov/libpthread-2.11.1.so 
00125000-00126000 r--p 00014000 08:05 1569987 /lib/tls/i686/cmov/libpthread-2.11.1.so 
00126000-00127000 rw-p 00015000 08:05 1569987 /lib/tls/i686/cmov/libpthread-2.11.1.so 
00127000-00129000 rw-p 00000000 00:00 0 
00129000-00146000 r-xp 00000000 08:05 1439060 /lib/libgcc_s.so.1 
00146000-00147000 r--p 0001c000 08:05 1439060 /lib/libgcc_s.so.1 
00147000-00148000 rw-p 0001d000 08:05 1439060 /lib/libgcc_s.so.1 
00223000-00376000 r-xp 00000000 08:05 1569962 /lib/tls/i686/cmov/libc-2.11.1.so 
00376000-00377000 ---p 00153000 08:05 1569962 /lib/tls/i686/cmov/libc-2.11.1.so 
00377000-00379000 r--p 00153000 08:05 1569962 /lib/tls/i686/cmov/libc-2.11.1.so 
00379000-0037a000 rw-p 00155000 08:05 1569962 /lib/tls/i686/cmov/libc-2.11.1.so 
0037a000-0037d000 rw-p 00000000 00:00 0 
00459000-0045a000 r-xp 00000000 00:00 0   [vdso] 
00471000-0048c000 r-xp 00000000 08:05 1440096 /lib/ld-2.11.1.so 
0048c000-0048d000 r--p 0001a000 08:05 1440096 /lib/ld-2.11.1.so 
0048d000-0048e000 rw-p 0001b000 08:05 1440096 /lib/ld-2.11.1.so 
00905000-0090c000 r-xp 00000000 08:05 1569989 /lib/tls/i686/cmov/librt-2.11.1.so 
0090c000-0090d000 r--p 00006000 08:05 1569989 /lib/tls/i686/cmov/librt-2.11.1.so 
0090d000-0090e000 rw-p 00007000 08:05 1569989 /lib/tls/i686/cmov/librt-2.11.1.so 
08048000-0804b000 r-xp 00000000 08:05 1458241 /home/neverMind/Desktop/SO-TP2/MMF/MMF_inverter 
0804b000-0804c000 r--p 00002000 08:05 1458241 /home/neverMind/Desktop/SO-TP2/MMF/MMF_inverter 
0804c000-0804d000 rw-p 00003000 08:05 1458241 /home/neverMind/Desktop/SO-TP2/MMF/MMF_inverter 
093a0000-093c1000 rw-p 00000000 00:00 0   [heap] 
b7700000-b7721000 rw-p 00000000 00:00 0 
b7721000-b7800000 ---p 00000000 00:00 0 
b781c000-b7855000 rw-s 00000000 08:05 1458172 /home/neverMind/Desktop/SO-TP2/MMF/out.ppm 
b7855000-b7857000 rw-p 00000000 00:00 0 
b7862000-b7863000 rw-s 00000000 00:04 52069041 /SYSV00000000 (deleted)Aborted 

Voici le code (Exécuter en tant ./invert input_filename.ppm output_filename.ppm) il doit être ppm:
main
functions c file
header file
makefile

Vous pouvez le tester avec ceci par exemple: ppm image with p6 header

Je ne fais que mapper le fichier dans le processus maître, avant de générer des enfants et de faire inverser chaque ligne sur ce fichier mappé. Est-ce correct?

+0

il vous semble en quelque sorte corrompre la mémoire, utilisez valgrind pour rechercher des erreurs. – Drakosha

Répondre

1

Entre autres, vous fermez deux fois vos poignées de fichiers. Exécutez votre programme sous valgrind, comme suggéré par Drakosha.

+0

Quels drapeaux me suggérez-vous d'utiliser? Parce que j'en ai déjà essayé quelques uns ... et il y avait un looooooot d'infos. Je suis ah ah ça, désolé. Je n'ai pas de compilateur C à portée de main pour le moment. mais je vois les deux fcloses. Je l'ai manqué. Il est toujours préférable de montrer votre code à quelqu'un, je suppose. – neverMind

+0

La plupart des callstacks que vous verrez proviendront de l'erreur double fclose(). Corrigez cela et réexécutez, vous verrez beaucoup moins de sortie. Itérer jusqu'à ce qu'il n'y ait plus d'erreurs. – ninjalj

+0

@neverMind: en fait, je n'ai pas regardé votre code. 'valgrind' m'a dit où était l'erreur de double-libre. – ninjalj

Questions connexes