linux进程通信--消息队列

原创 2016年05月31日 10:19:07
消息队列是一种消息的链表,用户可以对消息队列写入信息,读取信息。与无名管道类似,可以实现不相关进程之间的通信,但不同的是消息队列可以实现对消息的查询读取。
消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操作。实现消息队列的四种操作的函数
int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
    prt:指向消息结构的指针。该消息结构 msgbuf 为:
    struct msgbuf{
    long mtype;//消息类型
    char mtext[1];//消息正文}
    size_t msgsz 为消息字节数
    flag:IPC_NOWAIT 若消息并没有立即发送而调用进程会立即返回函数传入值
    0:msgsnd 调用阻塞直到条件满足为止
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
msgp:消息缓冲区
msgsz:消息字节数
msgtyp :消息类型
    0:接收消息队列中第一个消息
    大于 0:接收消息队列中第一个类型为 msgtyp 的消息Msgtype:
    小于 0:接收消息队列中第一个类型值不小于 msgtyp 绝对值且类型
    值又最小的消息
flag:MSG_NOERROR 若返回的消息比 size 字节多,则消息就会截短到size 字节,且不通知消息发送进程
    IPC_NOWAIT 若消息并没有立即发送而调用进程会立即返回函数传入值
    0:msgsnd 调用阻塞直到条件满足为止
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
cmd命令
    IPC_STAT:读取消息队列的数据结构 msqid_ds,并将其存储在
    buf 指定的地址中
    IPC_SET:设置消息队列的数据结构 msqid_ds 中的 ipc_perm 元
    素的值。这个值取自 buf 参数
    IPC_RMID:从系统内核中移走消息队列
buf:消息缓冲区

应用实例:使用消息队列实现两个进程之间的通信,发送端接收终端输入字符串,接收端将接收到的字符显示到终端,以end结束输入。
接收端实例

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdlib.h>

/************************************
int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
                      int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

*************************************/
#define MAX_SIZE 512
 struct msgbuf_struct
{
     long mtype;       /* message type, must be > 0 */
     char mtext[MAX_SIZE];    /* message data */
};
int main()
{

    struct msgbuf_struct data;
    char buffer[BUFSIZ];
    int msgid=-1;
    int run_flag=1;
    long int msgtyp=0;

    msgid=msgget((key_t)1234,IPC_CREAT|0666);
    if(msgid==-1)
    {
        printf("Creat message Queue failed!!\n");
        exit(EXIT_FAILURE);
    }
    while(run_flag)
    {

        if(msgrcv(msgid, (void *)&data, BUFSIZ, msgtyp, 0)==-1)
        {

            printf("recived message failed!\n");
            exit(EXIT_FAILURE);
        }
          printf("You write data is %s",data.mtext); 

        if(strncmp(data.mtext,"end",3)==0)//字符串比较函数
        {
            run_flag=0;
        }
        sleep(1);
    }
    if(msgctl(msgid,IPC_RMID, 0)==-1)
    {
        printf("close msgqueue failed!!\n");
    }
    return 0;
}

发送端实例

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdlib.h>
/************************************
int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
                      int msgflg);
*************************************/
#define MAX_SIZE 512
 struct msgbuf_struct
{
     long mtype;       /* message type, must be > 0 */
     char mtext[MAX_SIZE];    /* message data */
};
int main()
{

    struct msgbuf_struct data;
    char buffer[BUFSIZ];
    int msgid=-1;
    int run_flag=1;
    msgid=msgget((key_t)1234,IPC_CREAT|0666);
    if(msgid==-1)
    {
        printf("Creat message Queue failed!!\n");
        exit(EXIT_FAILURE);
    }
    while(run_flag)
    {
        printf("Enter some data:");
        fgets(buffer,BUFSIZ,stdin);
        strcpy(data.mtext,buffer);
        data.mtype=1;   //制定为发送操作
        if((msgsnd(msgid,(void*)&data,MAX_SIZE,0))==-1)   //标志位给定为0
        {
            printf("send message failed!!\n");
            exit(EXIT_FAILURE);
        }
        if(strncmp(buffer,"end",3)==0)//字符串比较函数
        {
            run_flag=0;
        }
        sleep(1);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

linux c++进程通信之消息队列

消息队列是一个存放在内核中的消息列
  • dasgk
  • dasgk
  • 2014年07月18日 18:36
  • 1280

Linux系统下-进程间通信(消息队列-详解)

Linux下,进程间通信方式: #(1)管道(Pipe)及有名管道(named pipe): #(2)信号量: #(3)共享内存: #(4)消息队列: #(5)套接口(Socket) #(6)信号(S...
  • sty23122555
  • sty23122555
  • 2016年04月12日 12:31
  • 9048

Linux进程间通信——消息队列应用实例

消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格...
  • li_wen01
  • li_wen01
  • 2017年01月20日 17:26
  • 428

Unix/Linux C++应用开发-进程通信消息队列

Linux系统下进程通信处理比较原始的管道方式以外,消息队列也是很多应用场合考虑使用的通信方式之一。消息队列通信方式也可以称为报文队列,在系统内核中消息队列实际上是实现消息的链表结构。Linux系统下...
  • wangfengwf
  • wangfengwf
  • 2016年10月15日 12:09
  • 1302

进程间通信方式之消息队列

消息队列进行通信的一些操作: 1、使用msgget()函数创建打开队列; 2、使用msgrcv()函数从队列中读数据; 3、使用msgsnd()函数写数据到队列中; 4、使用msgctl()函...
  • Echo_Ana
  • Echo_Ana
  • 2016年10月23日 21:56
  • 1152

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

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

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

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

linux 进程间通信三 消息队列以及实例

代码来自:嵌入式linux应用开发标准教程 消息可以理解为写信给某个人,这里在应用中是告诉系统写信人和写信的内容就可以了, 别人会来看发信人是谁,如果不是自己想要的就放弃读信或者只要有消息...
  • liang890319
  • liang890319
  • 2012年12月11日 09:40
  • 5611

linux c之通过消息队列实现进程通信

1、消息队列的介绍 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的...
  • u011068702
  • u011068702
  • 2017年02月17日 11:56
  • 531

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

Linux/Unix系统IPC是各种进程间通信方式的统称,但是其中极少能在所有Linux/Unix系统实现中进行移植。随着POSIX和Open Group(X/Open)标准化的推进呵护影响的扩大...
  • tf_apologize
  • tf_apologize
  • 2017年04月16日 11:52
  • 637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux进程通信--消息队列
举报原因:
原因补充:

(最多只允许输入30个字)