首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux systemV消息队列msgsnd失败解决方案

2014-01-01 
linux systemV消息队列msgsnd失败在linux下使用syetmV消息队列方式来传递数据现在msgsnd返回-1,但是使用ip

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的大小,你给的是整个控制结构体的大小
[解决办法]
大哥你坑死我了

if(msgsnd(msgid,&msx,1,0) == -1);

这多个;

我查了一个小时。擦得。

热点排行