Альтернативы ipcs

У меня есть приложение, которое использует сегменты разделяемой памяти System V. Обычно он управляет ими внутренне, и никто не должен их трогать. Но для экстренных случаев у нас есть утилита, которая вручную очищает сегменты разделяемой памяти.

Проблема в том, что для этого он запускается ipcsи захватывает куски вывода, используя cut. Это кажется довольно хрупким. Он уже запускает несколько разные команды на разных платформах, чтобы отразить тот факт, что вывод ipcs отформатирован по-разному в Linux / AIX / Solaris и т. Д.

Есть ли лучший способ найти сегменты разделяемой памяти, чем парсинг вывода ipcs?

1 ответ

Решение

Вы могли бы переопределить свою собственную версию ipcs это дает одинаковый вывод независимо от ОС. Это требует некоторого программирования на системном уровне.

В линуксе ipcs использования shmctl(0, SHM_INFO, ...) чтобы узнать индекс наибольшего используемого сегмента разделяемой памяти, затем запустите shmctl(index, SHM_STAT, ...) в цикле по всем индексам из 0 наивысший индекс, чтобы получить информацию о каждом сегменте. Это также должно работать на FreeBSD (не документировано, но очевидно из источника ядра), хотя на этой ОС ipcs использования sysctl читать значения kern.ipc.shm*,

На солярисе ipcs использования shmids(NULL, 0, &nids) чтобы получить количество идентификаторов сегментов, затем вызывает shmids(&ids, nids, ...) получить список фактических идентификаторов, а затем использует shmctl(id, IPC_STAT, ...) получить информацию по каждому сегменту.

ipcs Это довольно старый инструмент, и никто не ожидает, что его выход сильно изменится в будущем, по крайней мере, до тех пор, пока разделяемая память POSIX полностью не вытеснит SysV IPC.

Другие вопросы по тегам