在OSX上管理C语言的共享内存

4
我正在做一项大学任务,主要涉及IPC和共享内存。问题是,作为C语言的新手,我一直在测试我的应用程序(显然使用了shmgetshmat),已经测试了几个小时。可以想象,我没有对资源进行清理,现在无法运行应用程序,因为(我猜)shmget无法再分配更多资源了。
我的问题是:如何在不重启OSX的情况下获取此资源,并且是否有GUI工具或其他东西可用于监视/管理我正在创建的共享内存?
2个回答

3

也许有点晚了,但是现在有命令行工具可用于执行此操作。ipcs和ipcrm。

请查看它们的手册页面。


1

在每个持有共享内存段引用的进程中调用shmdt(“共享内存分离”)。Unix共享内存段是引用计数的,因此当最后一个进程从它们中分离时,可以使用shmctl(id, IPC_RMID, NULL)销毁它们。

从应用程序外部,我现在能想到的唯一选项是清除您的共享内存段:

for (int id=0; id < INT_MAX; id++)
    shmctl(id, IPC_RMID, NULL);

但这是一个非常低效的补救措施。(我也不确定它是否有效; 在Linux上它不起作用,但Linux违反了Unix标准,而MacOS X则经过认证。)


由于这是一项大学作业,我认为我不能这样做。但我会密切关注行为并观察发生的情况。 - Ash
返回值始终为-1(请参见上文)。或者我误解了你的意思? - Ash
不是的,但我执行了 entries = (FILE_entry *) shmat(shm_id, NULL, 0);,这样我就可以很好地存储数据。 - Ash
很抱歉,Ash,我恐怕不能再帮你了。请仔细阅读您的MacOS X manpages,或者发布一个新问题,或者用基于mmap的解决方案给您的教授留下深刻印象。 - Fred Foo
IPC_STAT不是必需的 - shmctl(id, IPC_RMID, NULL);就可以了(决定要操作的共享内存段的是id而不是shmid_ds)。 - caf
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接