码迷,mamicode.com
首页 > 其他好文 > 详细

UNIX环境下的消息队列

时间:2015-06-04 13:26:08      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:

  消息队列和共享内存一样,也是一种IPC对象。消息队列其实就是消息的链表,每一则消息都是用户自己的结构体。服务端这边创建消息队列,客户端这边打开消息队列,两个进程就可以进行通信。创建和打开消息队列使用函数msgget,发送消息到消息队列使用函数msgsnd,从消息队列中取出消息使用函数msgrcv,通信完毕后删除消息队列使用函数msgctl。这四个函数就是消息队列通信编程主要用到的函数,man命令就可以看到他们的详细信息。

  前面说到消息是用户自己构造的结构体,其实这个结构体也是有讲究的,这是linux给出的原型

struct msgbuf {
               long mtype;       /* message type, must be > 0 */
               char mtext[1];    /* message data */
           };

  第一个是整形数字,标识消息的类型,可由用户自己定义。第二个就是消息的内容。其他部分可由用户自己添加。下面直接贴代码吧,感觉代码比文字更直观。我这里只是扫盲式的学了一下,接收消息的时候比较简单粗暴,直接接受了当前队列的第一则消息,没有设置其他的标志。

/*send.c*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

struct msgt
{
    long msgtype;
    char msgtext[1024];
};

int main(int argc, char const *argv[])
{
    
    int i;
    int num;
    int msgid;
    
    struct msgt* msgs = (struct msgt*) malloc( sizeof(struct msgt));

    /*构造键值*/
    key_t key = ftok(".", 4);

    /*打开消息队列*/
    msgid = msgget(key, IPC_EXCL);

    printf("msgid is %d\n", msgid);

    while(1)
    {
        num = msgrcv(msgid, msgs, sizeof(struct msgt), 0, 0);
        if(num == -1)
            return;
        printf("message is %s\nnum is %d\n", msgs->msgtext, num);
        
        
    }
    free((void *) msgs);

    return 0;
}
/*recieve.c*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

struct msgt
{
    long msgtype;
    char msgtext[1024];
};

int main(int argc, char const *argv[])
{
    
    int i;
    int num;
    int msgid;
    
    struct msgt* msgs = (struct msgt*) malloc( sizeof(struct msgt));

    /*构造键值*/
    key_t key = ftok(".", 4);

    /*打开消息队列*/
    msgid = msgget(key, IPC_EXCL);

    printf("msgid is %d\n", msgid);

    while(1)
    {
        num = msgrcv(msgid, msgs, sizeof(struct msgt), 0, 0);
        if(num == -1)
            return;
        printf("message is %s\nnum is %d\n", msgs->msgtext, num);
        
        
    }
    free((void *) msgs);

    return 0;
}

  这里说点写这个程度出现的问题,一开始定义消息结构体的时候我是这么干的

struct msgt* msgs;

  正常运行发送和接收都还好,但是当send输入0退出程序时就出现段错误了,最后用core dump定位才发现定义结构体指针没有初始化,就这破问题调了好久,血淋淋的教训。以后再敲代码的时候一定要记住,结构体指针需要malloc初始化!!!嗯!

  如果有错误或者疑问,欢迎指出!

UNIX环境下的消息队列

标签:

原文地址:http://www.cnblogs.com/51qianrushi/p/4551382.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!