日期:2014-05-16  浏览次数:20798 次

linux systemV消息队列msgsnd失败
在linux下使用syetmV消息队列方式来传递数据
现在msgsnd返回-1,但是使用ipcs查看 对应的消息队列messages个数有相应的增加。。
这是为嘛?
实际上 我使用msgrcv函数也能接收到数据,但是同msgsnd类似msgrcv也提示失败。。。

发送方代码如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

struct msgbuf{
        long mtype;         /* type of message */
        char mtext[1];      /* message text */
};

int main(int argc,char* argv[])
{
        char dir[] = "svmq";//源程序目录下的文件
        int msgid;
        key_t key;
        key = ftok(dir,0);
        if(key == -1)
        {
                printf("ftok failed\n");
                return -1;
        }
        msgid = msgget(key,IPC_CREAT|0666);
        if(msgid == -1)
        {
                printf("message queue create failed!\n");
                return -1;
        }
        struct  msgbuf msx;
        int i = 0;
        while(i<5)//send five message
        {
                printf("send <%d> message!\n",i);
                msx.mtype = 8;
                msx.mtext[0] = '0'+ i;
                if(msgsnd(msgid,&msx,1,0) == -1);
                {
                        printf("msg send failed!%d\n",errno);
                }
                i++;
        }

        return 0;
}

------解决方案--------------------
 if(msgsnd(msgid,&msx,1,0) == -1);
第二个参数用的不对吧,API的说明,第二个参数是消息体的大小,也就是说,是msg text的大小,你给的是整个控制结构体的大小