c - 为什么会有错误号 S_objLib_OBJ_UNAVAILABLE?

标签 c message-queue vxworks

我想将一些数据发送到队列,但由于某种原因得到错误号 S_objLib_OBJ_UNAVAILABLE (3997698),我不知道为什么。这是我拥有的:

static MSG_Q_ID bfd_to_alm_data = NULL;
// in bfd_queues_create(void)
if (!bfd_to_alm_data) {
        bfd_to_alm_data = msgQCreate
            (
            MAX_BFD_MSGS,              /* max messages that can be queued */
            sizeof(bfd_report_t),         /* max bytes in a message */
            MSG_Q_FIFO               /* message queue options */
            );
        if (!bfd_to_alm_data) {
            printErrno(errno);
            jpax_logMsg(LOG_ERROR, LOGSTREAM_SWITCH, "ERROR: Failed to create queue for bfd messages to alarm engine. errno %d\n",errno,0,0,0,0);
            return ERROR;
        }
// and this is where I get the error:
if (!bfd_to_alm_data)
            rv = bfd_queues_create();
        if (rv < 0) {
            jpax_logMsg(LOG_ERROR, LOGSTREAM_SWITCH, "ERROR: Could not initialize bfd_to_alm_data! errcode %d \n",rv,0,0,0,0);
            return;
        }

        rv = msgQSend(bfd_to_alm_data, 
                &bfd_info,
                sizeof(bfd_report_t),
                NO_WAIT,
                MSG_PRI_NORMAL);        
        if (rv < 0) {
            jpax_logMsg(LOG_ERROR, LOGSTREAM_SWITCH, "ERROR: Could not push Bfd alarm data onto queue! errno %d\n",errno,0,0,0,0);
        }

这里可能发生了什么?

我可以确认,队列句柄在 msgQCreate()msgQSend() 调用之间保持不变

最佳答案

从手册(特别是内核 API 引用指南)中,我们可以看到当队列中没有空间时,errno 将设置为 S_objLib_OBJ_UNAVAILABLE,并且您已将 NO_WAIT 指定为超时值.

S_objLib_OBJ_UNAVAILABLE No free buffer space was available and the NO_WAIT timeout was specified.

我们可以在您的代码中看到您指定了 NO_WAIT。没有任何迹象表明 msgQ 应该已满 - 但也许您还没有显示所有代码。

要检查的事情:

  1. MAX_BFD_MSGS 的定义 - 确保它足够大
  2. 确保正在从队列中读取数据。
  3. 考虑使用WAIT_FOREVER。这将导致 msgQSend 操作阻塞,直到队列中有空间为止。

关于c - 为什么会有错误号 S_objLib_OBJ_UNAVAILABLE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39884291/

相关文章:

java - 即使服务器中途出现故障,如何可靠地确保本地和远程数据副本均已更新

c++ - 使用套接字发送 Iplimage

android - 在 2 个 native 模块 (Android NDK) 之间传递数据

ruby-on-rails - 在 RabbitMQ 中重新排队血汗工厂工作

message-queue - 消息总线 vs. 服务总线 vs. 事件中心 vs. 事件网格

c - VxWorks 上 strerror_r 消息的最大大小

vxworks 中的 C++ 11

c - 如何修改此组合算法以在启用 cuda 的 gpu 上并行运行?

c - malloc 的问题