Answers:
我处理信号量和共享内存的唯一经验是通过使用命令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
在@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
semget(2)
)一起出现,ipcs -s
因此,如果您使用的是POSIX信号量(与您获得的信号sem_open(2)
),则必须使用另一种方法。
ipcs
联机帮助页所述:“ Linux ipcs实用工具与POSIX ipcs实用工具不完全兼容。” 因此,我不确定他们是否想到了POSIX IPC。也许是ipcs
:) 的未来版本。
map
两种信号量的内容都是正确的吗?
/dev/shm
。现在,我们有了答案。:)
/proc/PID/maps
,您可以看到进程的内存映射,并且POSIX信号在中显示为附件/dev/shm
。我不确定SysV信号量。