我有一个使用 System V 共享内存段的应用程序。通常它在内部管理这些,没有人需要触摸它们。但是对于紧急情况,我们有一个实用程序可以手动清除共享内存段。
问题是,要做到这一点,它会运行ipcs
,并使用 cut 抓取输出的大块。这似乎很脆弱。它已经在不同平台上运行略有不同的命令,以反映 ipcs 输出在 Linux / AIX / Solaris 等上的格式不同的事实。
有没有比解析 ipcs 输出更好的方法来查找共享内存段?
我有一个使用 System V 共享内存段的应用程序。通常它在内部管理这些,没有人需要触摸它们。但是对于紧急情况,我们有一个实用程序可以手动清除共享内存段。
问题是,要做到这一点,它会运行ipcs
,并使用 cut 抓取输出的大块。这似乎很脆弱。它已经在不同平台上运行略有不同的命令,以反映 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 之前不会。