ipcs的替代品

时间:2013-07-24 14:33:48

标签: c ipc shared-memory ipcs

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

问题是,为了做到这一点,它运行ipcs,并使用cut来获取输出的块。这似乎很脆弱。它已在不同平台上运行稍微不同的命令,以反映在Linux / AIX / Solaris等上ipcs输出格式不同的事实。

是否有更好的方法来查找共享内存段而不是解析ipcs输出?

1 个答案:

答案 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之前不会发生变化。