我有一个使用 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/