【问题标题】:Managing Shared Memory in C on OSX在 OSX 上用 C 语言管理共享内存
【发布时间】:2011-05-15 18:30:02
【问题描述】:

我正在完成一项大学作业,主要基于 IPC 和共享内存。问题是,作为 C 的一个完整的菜鸟,我一直很高兴地测试我的应用程序(显然使用 shmgetshmat)几个小时。正如您可能猜到的那样,我自己并没有进行清理,现在我无法运行我的应用程序,因为(我假设)shmget 无法分配更多资源。

我的问题是:如何在不重新启动 OSX 的情况下取回该资源,是否有 GUI 工具或可以用来监视/管理我正在创建的共享内存的工具?

【问题讨论】:

    标签: c macos unix shared-memory


    【解决方案1】:

    也许有点晚了,但是有 cmdline 工具可以做到这一点。 ipcs 和 ipcrm

    看看他们的手册页。

    【讨论】:

      【解决方案2】:

      在每个持有对它的引用的进程中的共享内存段上调用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 已通过它的认证。)

      【讨论】:

      • 这其实很有用,但是如果我还没有这样做,我可以通过终端释放所有共享内存吗?
      • 我发布了一个更新,其中包含应该执行此操作的代码 sn-p。我不在 MacOS X 机器上,所以我无法检查为您执行此操作的命令。尝试man shmget 等并查看SEE ALSO 部分。
      • 好的,谢谢。至于您的建议,当我调用 shmdt(shm_id); 时,我的用法是否正确,其中 shm_id 是我最初调用 shmget() 时得到的 int ?如果我已经分叉了这个进程,shmget 引用是否也会被克隆(这样如果一个分叉的进程调用shmdt(),操作系统就不会破坏另一个进程的内存?)
      • 您的第一个假设是正确的。我在 Unix 标准中找不到跨叉的行为; Solaris 显然将该段传递给子进程。如果可能的话,我建议您使用MAP_SHARED (opengroup.org/onlinepubs/009695399/functions/mmap.html) 切换到mmap;该界面使用起来更简单
      • 自从这个id用于大学作业,我认为我不被允许。但我会密切关注行为,看看会发生什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      相关资源
      最近更新 更多