3

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

问题是,要做到这一点,它会运行ipcs,并使用 cut 抓取输出的大块。这似乎很脆弱。它已经在不同平台上运行略有不同的命令,以反映 ipcs 输出在 Linux / AIX / Solaris 等上的格式不同的事实。

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

4

1 回答 1

1

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 之前不会。

于 2013-07-29T11:51:22.973 回答