有关linux msgsnd()疑问求助

shinerise 2014-06-11 04:04:37
各位大侠,我在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()失败呢?

百思不得其解,还望大侠指点一下。多谢!
...全文
361 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinerise 2014-06-12
  • 打赏
  • 举报
回复
你说的是对的。非常感谢。多谢。
羽飞 2014-06-11
  • 打赏
  • 举报
回复
应该是这个结构体定义的有问题: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. 看看这个里面的解释:http://pubs.opengroup.org/onlinepubs/007908799/xsh/msgsnd.html

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧