2014-09-09 3 views
0

Когда вы открываете объект общей памяти (используя shm_open), вы предоставляете имя для этого объекта. У каждого объекта должно быть определенное имя.Техника поиска общих имен разделяемой памяти

Есть ли способ идентифицировать имена всех выделенных в настоящее время общих объектов? И если да, то как?

Обновление: Казалось бы, в моем случае это (как называет их @HristoLliev) сегменты разделяемой памяти System V. ipcs -m сообщает список сегментов, похожих на то, что я ожидаю, но не показывает имена.

+0

Можете ли вы попробовать 'ipcs -a'? ('-m' - только для общей памяти). –

+0

@ElliottFrisch: Здесь перечислены сегменты, но не имя, связанное с каждым. –

ответ

2

shm_open(3) на Linux полагается на tmpfs, обычно установленный под /dev/shm. То, что shm_open() делает, состоит в том, чтобы преобразовать имя объекта в путь к файлу, добавив его с точкой монтирования файловой системы tmpfs. Пока объект разделяемой памяти не отсоединил, он будет виден в файловой системе и все, что вам нужно сделать, это выдать простую команду: ls

$ ls /dev/shm 
pulse-shm-1 pulse-shm-2 pulse-shm-3 
... 

Некоторые дистрибутивы Linux имеют tmpfs установленный под другим монтирования. Для того, чтобы выяснить, где проблема:

$ mount -t tmpfs 
tmpfs on /dev/shm type tmpfs (rw) 

Если вы хотите знать, какой (ы) процесс имеет/имеют отображенные общие объекты памяти, команда lsof является вашим другом:

$ lsof /dev/shm 
COMMAND  PID  USER FD TYPE DEVICE SIZE/OFF NODE NAME 
kded4  30657 hristo mem REG 0,16 67108904 294877 /dev/shm/pulse-shm-1 
kded4  30657 hristo mem REG 0,16 67108904 294868 /dev/shm/pulse-shm-2 
knotify4 30687 hristo mem REG 0,16 67108904 294876 /dev/shm/pulse-shm-3 
pulseaudi 30717 hristo mem REG 0,16 67108904 294868 /dev/shm/pulse-shm-4 
shm.x  31878 hristo DEL REG 0,16   305893 /dev/shm/asd 

Unlinked совместно объекты больше не видны в файловой системе, хотя они могут по-прежнему сохраняться при сопоставлении каким-либо процессом, как в случае с последним процессом в списке выше - DEL в поле FD означает, что соответствующий файл был удален.

Обратите внимание, что сегменты разделяемой памяти системы V (полученные ipcs -m) живут в другом пространстве имен и не имеют соответствующих имен объектов, а всего лишь цифровых клавиш.

+0

@HristoLLiev: Мой каталог 'tmpfs', похоже, не содержит никаких имен, которые я ожидаю, и список, который я получаю от' ipcs -m', в то время как он не включает имена, выглядит как набор ожидаемых сегментов. Так что, как ваш ответ, он не совсем решает мою проблему. –

+1

Система V Объекты IPC не имеют имен. У них есть только цифровые клавиши, и есть функция удобства 'ftok()', которая принимает имя файла и объединяет части идентификаторов и номеров устройств с дополнительным 8-битным идентификатором для создания числового ключа (см. [Здесь] (http://code.metager.de/source/xref/gnu/glibc/sysvipc/ftok.c), как это делается). Функция не обратима, и вы не можете просто получить имя файла, используемое для генерации ключа (поскольку он хранит только младшие 16 бит номера inode). –

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