Я не думаю, что вы можете сделать это с помощью стандартных инструментов. Вы можете использовать ipcs -mp
, чтобы получить идентификатор процесса последний процесс для присоединения / отсоединения, но я не знаю, как получить все присоединенные процессы с ipcs
.
С сегментом, присоединенным к двум процессам, предполагая, что оба остались присоединенными, вы можете вычислить из PID cpid
создателя и последнего подключенного PID lpid
, которые являются двумя процессами, но это не будет масштабироваться до более чем двух процессов, поэтому его полезность ограничена.
Метод cat /proc/sysvipc/shm
кажется таким же ограниченным, но я считаю, что есть способ сделать это с другими частями файловой системы /proc
, как показано ниже:
Когда я делаю grep
на картах procfs
для всех процессов, я получаю записи, содержащие строки для процессов cpid
и lpid
.
Например, я получаю следующий сегмент общей памяти из ipcs -m
:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 123456 pax 600 1024 2 dest
, а с ipcs -mp
cpid
равно 3956, а lpid
равно 9999 для данного сегмента общей памяти (123456).
Затем с помощью команды grep 123456 /proc/*/maps
я вижу:
/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)
Так что - это способ получить процессы, которые к нему привязаны. Я почти уверен, что статус dest
и индикатор (deleted)
связаны с тем, что создатель пометил сегмент для уничтожения после того, как произойдет окончательное отделение, а не то, что он уже был уничтожен.
Таким образом, сканируя /proc/*/maps
«файлы», вы сможете обнаружить, какие PID-коды в данный момент прикреплены к данному сегменту.