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