这让我困惑了两天,我使用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
数组,则可以成功发送此消息。