【问题标题】:mq_unlink setting errno to EEXISTmq_unlink 将 errno 设置为 EEXIST
【发布时间】:2010-11-08 19:16:58
【问题描述】:

我在服务器中使用消息队列进行线程间通信。服务器在星期四晚上按预期运行。当我周一重新选择该项目时,它无法创建六个正在使用的队列中的两个,理由是它们已经打开(设置了 O_EXCL)。这不应该是这种情况,但是我添加了一个带有错误检查的 mq_unlink 调用,并从 mq_open 中删除了 O_EXCL 标志。

当我编译并运行时,mq_unlink 和 mq_open 都将 errno 设置为 EEXIST。这应该是不可能发生的:mq_unlink 在任何情况下都不能将 errno 设置为 EEXIST,而 mq_open 只能在设置 O_EXCL 标志时设置 EEXIST。

任何想法为什么会发生这种情况?

【问题讨论】:

  • 愚蠢的问题,但电话真的失败了吗?如果调用没有失败,你永远不能依赖 errno 的值。

标签: c solaris posix message-queue


【解决方案1】:

我相信这是一个 Solaris 错误。检查锁定文件(通常为/var/tmp/.MQL/...),如果您知道消息队列未在使用中,则将其删除。这应该允许unlink 成功。

【讨论】:

  • 原来它位于 /tmp。删除锁定文件确实允许我访问和取消链接队列。谢谢!如需更多信息,请参阅 Mauro 和 McDougall 撰写的 Solaris internals 第 457 页,可在 Google 图书上找到。
  • 哇,很好地追踪了像这样不起眼的东西! +1
猜你喜欢
  • 2017-05-29
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2010-10-18
  • 1970-01-01
相关资源
最近更新 更多