毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

消息队列函数msgsnd()失败

更新时间:2014-6-13:  来源:毕业论文

在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.

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。