Ответ 1
Я не думаю, что вы можете сделать это со стандартными инструментами. Вы можете использовать ipcs -mp
, чтобы получить идентификатор процесса последнего процесса для присоединения/отсоединения, но я не знаю, как получить все прикрепленные процессы с помощью ipcs
.
Если сегмент, прикрепленный к двум процессам, предполагается, что они оба остались прикрепленными, вы можете выяснить из создателя PID cpid
и последнего прикрепленного PID lpid
, которые являются двумя процессами, но которые не будут масштабироваться до более двух процессов, поэтому его полезность ограничена.
Метод cat /proc/sysvipc/shm
кажется таким же ограниченным, но я считаю, что есть способ сделать это с другими частями файловой системы /proc
, как показано ниже:
Когда я делаю a 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 в настоящее время подключены к данному сегменту.