2010-02-14 8 views
1

У меня есть код устаревшего кода, который использует shmget/shmat/shmdt для создания, присоединения и управления разделяемыми сегментами памяти.Изменение размера сегмента разделяемой памяти

Приложение с кодом иногда падает, оставляя сегменты в памяти. Код повторно использует один и тот же сегментный ключ для повторного подключения к ним, но проблема в том, что он использует разные объемы разделяемой памяти каждый раз и не может подключиться из-за этого.

Мой вопрос:

1) Можно ли изменить общий размер памяти на связи?

2) Если нет, то как я могу подключиться к сегменту разделяемой памяти (даже если бы я мог не знать размер), чтобы стереть его (для последующего воссоздания более нового)?

Спасибо!

ответ

1

Вы можете использовать shmctl, чтобы удалить и создать свой собственный размер. Я предполагаю, что устаревший код будет пытаться использовать существующую разделяемую память, если он не умеет shmget?

+0

Hi. Shmctl требует shmid, который может быть восстановлен только shmget. И shmget не работает, если я не знаю точный размер. Это точно проблема :). Любая идея? – SyBer

+0

Вы должны иметь возможность использовать strace, чтобы выяснить, что использует shmget, используемое приложением. – 2010-02-14 16:37:12

+0

У меня есть исходный код приложения - это не проблема. Проблема в том, что размер выделенной общей памяти может отличаться от уже заданного. В этом случае shmget не работает - поскольку для этого требуется EXACT-размер существующего сегмента разделяемой памяти (который неизвестен во время работы shmget). – SyBer

Смежные вопросы