4

我使用适当的标志打开共享内存和信号量:

sem = sem_open("/some_name", O_CREAT | O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO, 1);
shm = shm_open("/other_name", O_RDWR | O_CREAT | O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO);

调用不会失败(我检查它们),并且确实有一个进程由其他进程创建它们forkexec而其他进程确实共享内存和信号量,并且有适当的同步。

但是,当我使用该ipcs命令时,我看不到共享内存和信号量。这是为什么?如果它们没有出现ipcs,我在哪里可以检查它们?


在我的ipcs输出中,信号量数组列表中没有任何条目,共享内存中的条目与 skype、firefox 和 plugin-container(firefox)相关。我检查了他们

grep shmid /proc/*/maps     # observe pid
readlink /proc/pid/exe
4

3 回答 3

3

我刚刚发现的一个解决方案是共享内存和共享信号量列在下面:

/dev/shm

那里的文件对于了解存在哪些共享对象以及可能对unlink它们有用,但它们不提供除此之外的任何有用信息(就像ipcs那样)。

于 2013-03-27T14:23:38.457 回答
3

Ipcs 仅报告 System V 共享内存。您必须使用 Posix 共享内存。显然,这是两种完全不同的机制。Posix shm 显示在 /dev/shm 下。

我遇到了同样的问题,并且接受的答案不够令人满意,因为它没有解释为什么会发生这种情况。我在另一个类似的问题中找到了答案: 我看不到 boost::interprocess 通过 shell 命令 ipcs 创建的共享内存

“据我所知,ipcs 只报告 System V 共享内存。POSIX 共享内存是一个单独的区域,必须单独查询。在 linux 系统上,检查 /dev/shm。”

于 2020-08-14T10:03:05.753 回答
0

就我而言,解决方案是使用sudo

sudo ipcs -m
于 2020-04-13T20:56:10.127 回答