Проблемы с отображенными в память файлами с папами и дочерними процессами - PullRequest
3 голосов
/ 22 ноября 2010

У меня есть программа, которая должна использовать mmf для отображения ppm-изображения в памяти, а затем каждому дочернему элементу придется инвертировать строка за строкой mmf. В нем говорится: «Версия MMF сначала должна создать копию изображения (и переименовать ее в имя файла судьбы), а затем выполнить инверсию для этой копии». Семафоры также в правильном порядке и в соответствии с назначением.

Исходя из этого, я кодировал, и это дает мне правильный вывод, но это происходит: S. Я не понимаю почему, но это явно не правильно:

(...)
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

Вот код (запускается как ./invert input_filename.ppm output_filename.ppm), он должен быть ppm:
основной
файл функций c
заголовочный файл
makefile

Вы можете проверить это, например: стр / мин изображение с заголовком p6

Я только сопоставляю файл в главном процессе, перед тем как порождать потомков и заставлять каждого потомка инвертировать строку в этом сопоставленном файле. Это правильно?

1 Ответ

1 голос
/ 23 ноября 2010

Помимо прочего, вы закрываете свои файловые дескрипторы дважды.Запустите вашу программу под valgrind, как предложил Дракоша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...