如何通过/ proc获取当前正在运行信号量的进程?


16

我想知道如何获取当前正在运行信号量的进程/proc?我想可以通过SysVIPC子目录来实现。但是我不知道如何使用此命令。

Ubuntu 12.10


1
在中/proc/PID/maps,您可以看到进程的内存映射,并且POSIX信号在中显示为附件/dev/shm。我不确定SysV信号量。
lgeorget

@lgeorget和我本人已经确认,/proc/PID/maps对于给定的PID ,POSIX和SysV信号量实际上都已显示在文件中。
slm

但显然,共享内存片段也作为条目出现在其中,/dev/shm并且它们与信号量几乎没有区别(除非它们具有巧妙的名称)。
lgeorget

Answers:


22

我处理信号量和共享内存的唯一经验是通过使用命令ipcs。看看在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留下的注释的基础上,我深入研究了PID 2265的/proc/2265/map内容,并找到了以下/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

据我所知,只有System V信号量(与您获得的信号semget(2))一起出现,ipcs -s因此,如果您使用的是POSIX信号量(与您获得的信号sem_open(2)),则必须使用另一种方法。
lgeorget

知道有什么终端命令会返回sem_open(2)变量吗?只是好奇。我对信号量所了解的一切都在8-)的答案中。
slm

不,那是问题。;)如ipcs联机帮助页所述:“ Linux ipcs实用工具与POSIX ipcs实用工具不完全兼容。” 因此,我不确定他们是否想到了POSIX IPC。也许是ipcs:) 的未来版本。
lgeorget

map两种信号量的内容都是正确的吗?
slm

大概吧。信号灯必须以一种或另一种方式附加在过程存储器中的某个位置。但是我不确定SysV信号量是否也在伪文件系统中创建/dev/shm。现在,我们有了答案。:)
lgeorget
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.