【问题标题】:Posix message queue creation gives "Cannot allocate memory" error after a couple of execution!Posix 消息队列创建在执行几次后会出现“无法分配内存”错误!
【发布时间】:2011-07-14 01:17:45
【问题描述】:

我创建了 4 个子进程,并通过一对夫妇的消息队列进行通信。在几次执行后我成功地做到了,它给出了错误“无法分配内存”。我猜这是由于没有正确删除现有队列造成的。在程序结束之前,我是否需要在每个子进程执行中关闭或取消链接,或者在父进程中关闭它们就足够了。或者有什么方法可以关闭 - 在命令行(shell)上用一些命令取消链接。有什么建议!我需要重新启动系统作为解决方案,但这当然需要时间。

感谢您的帮助!

【问题讨论】:

  • 发布您的代码(或其中的一部分) - 我们不是通灵者。
  • 这是硬件作业,我不想被任何人抄袭
  • @user:如果你向你的老师提供这个问题的链接(无论如何这都是诚实的做法),那么抄袭你的代码没有人能逃脱惩罚。
  • 拉尔斯曼+100;害怕另一个学生在试图让 SO 帮忙做作业时抄袭发布的代码是非常荒谬的。

标签: c posix ipc message-queue


【解决方案1】:

如果您按照man mq_overview 中的说明挂载 MQ 虚拟文件系统,则可以使用 C API 或使用 shell 取消 POSIX 消息队列的链接(这将为您提供“磁盘”上的“目录”(不是真的,当然),然后您可以在其中使用 lsrm 等命令。

手册页还讨论了在其他队列未被正确丢弃时阻止您创建新队列的相关限制。

【讨论】:

    【解决方案2】:

    是的,您需要在每个子进程中调用 mq_close() 否则队列不会被删除。 mq_unlink() 的帮助说,

    如果一个或多个进程具有 当 mq_unlink() 为时打开消息队列 调用,销毁消息 队列被推迟到所有 对消息队列的引用有 被关闭。然而,mq_unlink() 呼叫不需要阻塞,直到所有 参考资料已关闭;有可能 立即返回。

    http://pubs.opengroup.org/onlinepubs/007908799/xsh/mq_unlink.html

    【讨论】:

    • 这与普通文件在 Unix 上的工作方式基本相同(直到最后一个打开的描述符被关闭,它们才真正被删除)。
    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 2018-10-18
    • 2017-11-18
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2014-11-06
    相关资源
    最近更新 更多