在linux 3.2上写代码,用到了消息队列函数msgsnd(),发现一个奇怪问题。问题描述如下:
1.样例代码如下:
int32_t dwRet = 0;
uint8_t ucTest[20] = {1,2,3,4};
DMOMsg *pstMsg = (DMOMsg *)ucTest;
pstMsg ->udwMsgID = SCOM_MSG_RX; //此行代码会导致发送失败
dwRet = msgsnd(mq_id, ucTest, 20, IPC_NOWAIT);
// printf("snd ret %d,errno:%d\n",dwRet,errno);
如上代码,我如果调用了一次: pstMsg ->udwMsgID = SCOM_MSG_RX 这行代码,会导致下面的msgsnd()函数失败,此时查看errno,错误码是22,也就是无效的参数。但是我如果不调用这一行代码,发送消息就会正确,我在其他地方可以正确读出消息队列里的消息{1,2,3,4}这串数据。
为什么会这样呢?我只是简单的执行了一条: pstMsg ->udwMsgID = SCOM_MSG_RX 代码,理论上只是对ucTest[]数组进行了一次赋值操作而已,就会导致后面的msgsnd()失败呢?
应该是这个结构体定义的有问题:DMOMsg
设置成员变量udwMsgID的时候,msgsnd发送的消息,需要的那个mttype是个非法值
struct mymsg {
long int mtype; /* message type */
char mtext[1]; /* message text */
};
可以定义个这样的结构体,第一个mtype不要写成负数
原文中这么说的:The structure member mtype is a non-zero positive type long int that can be used by the receiving process for message selection.