关闭

进程通信之消息队列

95人阅读 评论(0) 收藏 举报
分类:

1、消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级

2、 对消息队列有写权限的进程可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。

3、man 2 msgrcv

4、函数int msgget(key_t key, int msgflg)

     –参数“key”:消息队列关联的标识符  key =  IPC_PRIVATV = 0 
     –参数“msgflg”:消息队列的建立标志和存取权限。IPC_CREAT 如果内核中没有此队列则创建它;IPC_EXCL 当          和IPC_CREAT 一起使用时,如果队列已经存在,则失败。
     –返回值:执行成功则返回消息队列的标识符,否则返回-1。


5、 #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/msg.h>

       int msgctl(int msqid, int cmd, struct msqid_ds *buf);

msqid:为指定的要操作的队列
cmd:参数指定所要进行的操作,其中有些操作需要buf参数。
IPC_STAT
IPC_SET
IPC_RMID //删除消息队列

struct msqid_ds {
       struct ipc_perm msg_perm;     /* Ownership and permissions */
       time_t          msg_stime;    /* Time of last msgsnd(2) */
       time_t          msg_rtime;    /* Time of last msgrcv(2) */
       time_t          msg_ctime;    /* Time of last change */
       unsigned long   __msg_cbytes; /* Current number of bytes in
                                                queue (nonstandard) */
       msgqnum_t       msg_qnum;     /* Current number of messages
                                                in queue */
       msglen_t        msg_qbytes;   /* Maximum number of bytes
                                                allowed in queue */
       pid_t           msg_lspid;    /* PID of last msgsnd(2) */
       pid_t           msg_lrpid;    /* PID of last msgrcv(2) */
};

The ipc_perm structure is defined as follows (the highlighted fields are settable using IPC_SET):

struct ipc_perm {
       key_t          __key;       /* Key supplied to msgget(2) */
       uid_t          uid;         /* Effective UID of owner */
       gid_t          gid;         /* Effective GID of owner */
       uid_t          cuid;        /* Effective UID of creator */
       gid_t          cgid;        /* Effective GID of creator */
       unsigned short mode;        /* Permissions */
       unsigned short __seq;       /* Sequence number */
};


6、函数ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg)

      –参数msqid:消息队列的标识码

      –参数*msgp:指向消息缓冲区的指针

      –参数msgsz:消息的长短

      参数msgtyp

             • msgtyp等于0 ,则返回队列的最早的一个消息

             • msgtyp大于0,则返回其类型为mtype的第一个消息

             • msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息

      –参数msgflg:标志位为0,则表示忽略

      –返回值:成功返回数据长度,错误返回-1


7、函数int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)

     –参数msqid:消息队列的标识码

     –参数*msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构

     –参数msgsz:消息的长短

     –参数msgflg:标志位

     –返回值:成功返回0,错误返回-1

结构体msgp,是一个标准的通用结构

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

例:

msgsend.c

#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  
#include <sys/msg.h>  
#include <errno.h>  
  
#define MAX_TEXT 512  
struct msg_st  
{  
    long int msg_type;  
    char text[MAX_TEXT];  
};  
  
int main()
{  
    int running = 1;  
    struct msg_st data;  
    char buffer[BUFSIZ];  
    int msgid = -1;  
  
    //建立消息队列  
    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);  
    if(msgid == -1)  
    {  
        fprintf(stderr, "msgget failed with error: %d\n", errno);  
        exit(EXIT_FAILURE);  
    }  
  
    //向消息队列中写消息,直到写入end  
    while(running)  
    {  
        //输入数据  
        printf("Enter some text: ");  
        fgets(buffer, BUFSIZ, stdin);  
        data.msg_type = 1;    //注意2  
        strcpy(data.text, buffer);  
        //向队列发送数据  
        if(msgsnd(msgid, (void*)&data, MAX_TEXT, 0) == -1)  
        {  
            fprintf(stderr, "msgsnd failed\n");  
            exit(EXIT_FAILURE);  
        }  
        //输入end结束输入  
        if(strncmp(buffer, "end", 3) == 0)  
            running = 0;  
        sleep(1);  
    }  
    exit(EXIT_SUCCESS);  
}

msgreceive.c

#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  
#include <errno.h>  
#include <sys/msg.h>  
  
struct msg_st
{  
    long int msg_type;  
    char text[BUFSIZ];  
};  
  
int main()  
{    int running = 1;  
    int msgid = -1;  
    struct msg_st data;  
    long int msgtype = 0; //注意1  
    

	
  
    //建立消息队列  
    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);  
    if(msgid == -1)  
    {  
        fprintf(stderr, "msgget failed with error: %d\n", errno);  
        exit(EXIT_FAILURE);  
    }  
    //从队列中获取消息,直到遇到end消息为止  
    while(running)  
    {  
        if(msgrcv(msgid, (void*)&data, BUFSIZ, msgtype, 0) == -1)  
        {  
            fprintf(stderr, "msgrcv failed with errno: %d\n", errno);  
            exit(EXIT_FAILURE);  
        }  
        printf("You wrote: %s\n",data.text);  
        //遇到end结束  
        if(strncmp(data.text, "end", 3) == 0)  
            running = 0;  
    }  
    //删除消息队列  
    if(msgctl(msgid, IPC_RMID, 0) == -1)  
    {  
        fprintf(stderr, "msgctl(IPC_RMID) failed\n");  
        exit(EXIT_FAILURE);  
    }  
    exit(EXIT_SUCCESS);  
} 










0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

linux进程间通信——消息队列

消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息 ...
  • xinianbuxiu
  • xinianbuxiu
  • 2016-10-27 23:17
  • 148

进程间通信----使用消息队列

面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道 一、什么是消息队列 消息...
  • zhanghuaichao
  • zhanghuaichao
  • 2016-11-20 17:07
  • 710

进程间通信:消息队列(代码实现)

消息队列:1.一种从一个进程向另外一个进程发送数据块的方法;                     2.每个数据块都被认为是有一个类型,接受者进程接收的数据块可以有不同的类型值;   &#...
  • wangiijing
  • wangiijing
  • 2016-07-05 23:21
  • 2066

进程间通信系列 之 消息队列应用实例

进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间...
  • iamonlyme
  • iamonlyme
  • 2013-11-13 08:33
  • 1856

Linux系统编程——进程间通信:消息队列

消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法。对于消息队列的操作,我们可以类比为这么一个过程:假如 A 有个东西要给 B,因为某些原因 A 不能当面直接给 B,这时候他们需要借助第...
  • tennysonsky
  • tennysonsky
  • 2015-06-02 20:45
  • 2839

【Linux进程间通信】 - 消息队列

今天我们来介绍一下如何使用消息队列来进行进程间通信。1、消息队列消息队列是由内核维护的一种链式结构。链表中每一个记录又称作消息,消息具有特定的格式和优先级别。各个进程通过消息队列标识符来引用消息队列,...
  • Xiejingfa
  • Xiejingfa
  • 2016-03-19 15:37
  • 1133

深入理解进程间通信之消息队列,个人总结key值与id

转载来源:http://www.linuxidc.com/Linux/2015-07/119990.htm 个人总结key值与id:id就是指每个消息队列的标记值,而key值就是表示如何找到这个消息...
  • yanxinrui0027
  • yanxinrui0027
  • 2016-06-14 10:54
  • 2195

进程间通信方式总结——消息队列

Linux/Unix系统IPC是各种进程间通信方式的统称,但是其中极少能在所有Linux/Unix系统实现中进行移植。随着POSIX和Open Group(X/Open)标准化的推进呵护影响的扩大...
  • tf_apologize
  • tf_apologize
  • 2017-04-16 11:52
  • 586

进程间通信(IPC)之消息队列

漫谈进程间通信之消息队列,进程通信家族中不可或缺的一员。交流学习,共同进步。
  • Xiao__Tian__
  • Xiao__Tian__
  • 2016-07-07 01:24
  • 3339

进程通信之消息队列(csdn)

1. 基本概念 消息队列的最佳定义是:内核地址空间中的内部链表。消息可以顺序地发送到队列中, 并以几种不同的方式从队列中获取。当然,每个消息队列都是由 IPC标识符所唯一标识的。 2. 内部和用...
  • fortunate1y
  • fortunate1y
  • 2014-06-30 13:45
  • 547
    个人资料
    • 访问:40229次
    • 积分:1285
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:74篇
    • 译文:0篇
    • 评论:2条
    最新评论