Альтернативы 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.