Как получить процессы, в настоящее время работающие с семафорами, через / proc?

16

Интересно, как получить процессы, в которых в настоящее время выполняются семафоры /proc? Я предполагаю, что это возможно подкаталогом SysVIPC. Но я не знаю, как использовать эти команды.

Ubuntu 12.10

Ханна
источник
1
В /proc/PID/maps, вы можете увидеть отображение памяти процесса, и семафоры POSIX отображаются в виде вложенных файлов в /dev/shm. Я не уверен насчет семафоров SysV.
lgeorget
@lgeorget и я подтвердили, что семафоры POSIX и SysV действительно отображаются в /proc/PID/mapsфайле для данного PID.
SLM
Но, по-видимому, фрагменты общей памяти также отображаются в виде записей, /dev/shmи они довольно неотличимы от семафоров (за исключением случаев, когда у них есть умные имена).
lgeorget

Ответы:

21

Мой единственный опыт работы с семафорами и общей памятью - использование команды ipcs. Посмотрите man-страницу ipcs для более подробной информации.

Эта команда показывает, какие процессы имеют семафоры:

$ ipcs -s

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x4d114854 65536      saml       600        8         

С известной полуидой мы можем запросить дополнительную информацию о PID, которые имеют семафоры (обратите внимание, что есть 8 - столбец nsems):

$ ipcs -s -i 65536

Semaphore Array semid=65536
uid=500  gid=501     cuid=500    cgid=501
mode=0600, access_perms=0600
nsems = 8
otime = Sun May 12 14:44:53 2013  
ctime = Wed May  8 22:12:15 2013  
semnum     value      ncount     zcount     pid       
0          1          0          0          0         
1          1          0          0          0         
2          1          0          0          2265      
3          1          0          0          2265      
4          1          0          0          0         
5          1          0          0          0         
6          1          0          0          4390      
7          1          0          0          4390 

Столбец pid - это эти процессы. Вы можете просмотреть их, используя psили просмотреть /procфайловую систему /proc/<pid>.

Например:

$ more /proc/2265/cmdline 
mono

POSIX & SystemV

Основываясь на комментарии, оставленном @lgeorget, я покопался в /proc/2265/mapсодержимом своего PID 2265 и нашел следующие /dev/shmссылки:

$ grep shm /proc/2265/maps 
7fa38e7f6000-7fa38ebdf000 rw-s 00000000 00:11 18517                      /dev/shm/mono-shared-500-shared_fileshare-grinchy-Linux-x86_64-40-12-0
7fa38f0ca000-7fa38f0cb000 rw-s 00000000 00:11 18137                      /dev/shm/mono.2265
7fa3967be000-7fa3967d3000 rw-s 00000000 00:11 18516                      /dev/shm/mono-shared-500-shared_data-grinchy-Linux-x86_64-328-12-0
SLM
источник
Насколько я знаю, только семафоры System V (те, которые вы получаете semget(2)) отображаются, ipcs -sпоэтому, если вы используете семафоры POSIX (те, которые вы получаете sem_open(2)), вы должны использовать другой метод.
lgeorget
Знаете какие-нибудь команды терминала, которые будут возвращать разновидность sem_open (2)? Просто любопытно. Все, что я знаю о семафорах, находится в ответе выше 8-).
SLM
Нет, это проблема. ;) Как ipcsсказано на man-странице: «Утилита Linux ipcs не полностью совместима с утилитой POSIX ipcs». так что я не уверен, что они даже подумали о POSIX IPC. Возможно будущий выпуск ipcs:).
lgeorget
содержание mapобоих семафоров мысли, верно?
SLM
Полагаю, что так. Так или иначе, семафоры должны быть прикреплены где-то в памяти процесса. Но я не был уверен, что семафоры SysV также были созданы в псевдофайловой системе /dev/shm. Теперь у нас есть ответ. :)
lgeorget