HI,
У меня есть программа, в которой мастер обрабатывает N рабочих, которые инвертируют каждую строку изображения, давая в конце инвертированное изображение.Программа использует общую память и семафоры posix, безымянные sems, более конкретно, и я использую shmctl с IPC_RMID, а также sem_close и sem_destroy в функции terminate ().Однако, когда я запускаю программу несколько раз, иногда она вызывает ошибку сегментации и находится в первом shmget.Я уже изменил свое значение shmmax в ядре, но я не могу сделать то же самое со значением shmall, не знаю почему.
Может кто-нибудь помочь мне?Почему это происходит и почему не все время?Код выглядит нормально, дает мне то, что я хочу, эффективно и так ... но иногда мне приходится перезагружать Ubuntu, чтобы иметь возможность запустить его снова, даже если я думаю, что я освобождаю ресурсы.
Пожалуйста, просветите меня!
РЕДАКТИРОВАТЬ:
Вот 3 файла, необходимые для запуска кода + make-файл:
http://pastebin.com/JqTkEkPv
http://pastebin.com/v7fQXyjs
http://pastebin.com/NbYFAGYq
http://pastebin.com/mbPg1QJm
Вы должны запустить его следующим образом ./invert someimage.ppm outimage.ppm (пока протестируйте с небольшим, пожалуйста)
Вот некоторые значения, которые могут быть важны:
$ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 262144
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
$ipcs -ls
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
РЕДАКТИРОВАТЬ: ошибка сегмента была решена!Я выделял массив ** в разделяемой памяти, и это было немного странно. Итак, я выделил сегмент только для массива * и вуаля.Если хотите, проверьте новый код и оставьте комментарий.