消息队列:调用msgsnd返回-1

时间:2017-06-15 11:38:49

标签: linux message-queue

这让我困惑了两天,我使用msgsnd发送消息但返回-1,而错误号errno是22(EINVAL),这意味着&# 34;参数无效"。在document中,如果满足以下条件,则会显示此错误:

Invalid msqid value, or nonpositive mtype value, or invalid msgsz value (less than 0 or greater than the system value MSGMAX).

在我的代码中,msqid为0是正确的,而mtype为16且msgsz为1600. MSGMAX中的值/proc/sys/kernel/msgmax为8192默认情况下,大于1600.所以我认为所有这些条件都已实现。但我怀疑它是msgsz问题,因为当我将1600的大小减小到1000时,可以发送此消息。

我的代码来了:

typedef struct
{
  MASK_BASE_UNIT   value[MASK_SIZE(MAX_PORTS)];
} PORT_MASK_t;

typedef struct _packet_
{
  unsigned char     data[MAX_PACKET_SIZE]; //MAX_PACKET_SIZE = 1558
  unsigned int      asic;
  unsigned int      pkt_len;
  unsigned int      source_port;
  PORT_MASK_t       dst_port_mask;
} PACKET_t;

typedef struct _packet_msg_
{
  unsigned int      appMask;
  PACKET_t          packet;
  int               ltcRequestId;
} MSG_t;

STATUS pkt_mux_packet_handler (MSG_t *msg)
{
    MSG_t msg_data;
    ...
    memset(&msg_data, 0, sizeof(msg_data));
    memcpy(&msg_data, msg, sizeof (msg_data));
    if (-1 == msgsnd (pkt_mux_info.recvMsgQid, &msg_data, sizeof(MSG_t), 0)) //sizeof(MSG_t) == 1600
    {
        printf("%s called, failed: errno: %s, error code:%d\n", __func__, strerror(errno), errno);
        fflush(stdout);
        return STATUS_FAILURE;
    }
}

还有一件奇怪的事情是,如果我清除data中的msg_data->packet数组,则可以成功发送此消息。

0 个答案:

没有答案