c - ipcs 的替代品

标签 c ipc shared-memory ipcs

我有一个使用 System V 共享内存段的应用程序。通常它在内部管理这些,没有人需要接触它们。但对于紧急情况,我们有一个实用程序可以手动清除共享内存段。

问题是,为了做到这一点,它运行ipcs,并使用 cut 抓取输出 block 。这看起来相当脆弱。它已经在不同平台上运行略有不同的命令,以反射(reflect) ipcs 输出在 Linux/AIX/Solaris 等上的格式不同的事实。

有没有比解析 ipcs 输出更好的方法来查找共享内存段?

最佳答案

您可以重新实现您自己的 ipcs 版本,无论操作系统如何,它都会提供相同的输出。但这需要一些系统级编程。

在 Linux 上 ipcs 使用 shmctl(0, SHM_INFO, ...) 找出最高使用共享内存段的索引,然后运行 ​​shmctl (index, SHM_STAT, ...) 循环遍历从 0 到最高索引的所有索引,以获得有关每个段的信息。这也应该适用于 FreeBSD(没有记录,但从内核源代码中可以看出),尽管在该操作系统上 ipcs 使用 sysctl 读取 kern.ipc 的值。 shm*.

在 Solaris 上,ipcs 使用 shmids(NULL, 0, &nids) 获取段 ID 的数量,然后调用 shmids(&ids, nids, .. .) 获取实际 ID 列表,然后使用 shmctl(id, IPC_STAT, ...) 获取每个段的信息。

ipcs 是一种相当古老的工具,人们不会期望它的输出在未来发生太大变化,至少在 POSIX 共享内存完全取代 SysV IPC 之前不会。

关于c - ipcs 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17837088/

相关文章:

Java volatile变量影响其他非volatile变量的内存一致性

c - VTune 2013 Profiler 给出错误 : “The Data Cannot be displayed,there is no viewpoint available for data ”

c - 如何清理 IPC 消息队列?

c - 管道 "bad address"管道打开

c++ - Boost、共享内存和 vector

c++ - 共享内存大小计算c++

c++ - 准备好的语句可以跨线程共享吗?

c - cast 中的中间指针必须是 "const qualified"- 为什么?

c - 宏是否可以评估另一个参数的多个参数?

Java 静态与线程堆栈