我有一个使用System共享内存段的应用程序。通常情况下,它在内部管理这些,没有人需要去触摸它们。但对于紧急情况,我们有一个实用程序,可以手动清除共享内存段。
问题是,为了做到这一点,它运行ipcs,并使用cut获取输出的块。那看起来很脆弱。它已经在不同的平台上运行了一些不同的命令,以反映在Linux / AIX / Solaris等上ipcs输出的格式化方式不同的事实。
有比解析ipcs输出更好的方法来找到共享内存段吗?
发布于 2013-07-29 11:51:22
您可以重新实现您自己版本的ipcs,它提供相同的输出,而不管操作系统是什么。这需要一些系统级的编程。
在Linux上,ipcs使用shmctl(0, SHM_INFO, ...)查找使用最多的共享内存段的索引,然后在从0到最高索引的所有索引上循环运行shmctl(index, SHM_STAT, ...),以获取关于每个段的信息。这也应该适用于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之前是如此。
https://stackoverflow.com/questions/17837088
复制相似问题