进程间的通信(一)消息队列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CY071512/article/details/80156967

消息队列

  消息队列是存储消息的线性表,是消息在传输过程中的容器,消息队列一经创建,即可以向队列中写入指定类型消息,其他进程可以从该队列中取出指定类型的消息。
  消息是进程间通信的数据内容,在消息队列机制中,消息是有类型的,也就是说,一条消息不仅包括数据,也包括消息的类型信息,对于同一个消息队列来说,可以存储不同类型的信息,进程可以根据需要从消息队列中取出自己需要的类型信息。
  这里写图片描述

消息队列的特点

  1.消息队列中的消息是有类型的,发送消息时可以指定类型,接受消息时,可以按照消息类型从队列中读取信息
  2.消息按照发送的顺序排队,相同类型的消息,先入队的消息先被接收。
  3. IPC机制的作用范围是整个系统范围内,而不限于进程,也就是说,一旦IPC对象被创建,除非显示的删除该对象或者系统重启,否则该对象一直存在,而进程内打开的文件在进程退出后自动关闭,IPC对象不存在关闭的概念,进程退出后,IPC对象仍然存在,其中数据也不变。

消息队列的控制

  1.首先系统能创建多少个消息队列,我们可以用命令查看:

cat/proc/sys/kernel/msgmni

  2.其次每条消息队列中最多能装多少字节的消息:

cat/proc/sys/kernel/msgmnb

  3.如何创建一条消息队列:我们用函数msgget 可以做到

 int msgget(key_t key, int msgflg); //函数原型

  创建一个新的队列时,flag选用参数IPC_CREAT,获取一个已经存在的消息队列标识符时,将该参数设置为0
   返回值:-1(失败),消息队列创建满或者尝试打开1别人的消息
       id(成功),标识已经打开的消息队列,返回可用的标识符
   4.如何用命令查看或者删除我们我们创建的消息队列:

ipcs -q//查看当前目录下的消息队列
ipcrm -Q key//删除关键字key的消息队列

  5.创建好消息队列后,那么我们如何向队列中写入数据以及读取数据

//写入数据选用函数msgsnd
int msgsnd(int msqid, //消息队列的标识符,通常由msgget获得
           const void *msgp, //想写入消息队列数据的地址
           size_t msgsz, //消息的大小
           int msgflg);//一般设置为0
//读取数据选用函数msgrcv
 ssize_t msgrcv(int msqid,
                void *msgp, //接收的信息存放位置
                size_t msgsz, //接收消息的地方大小
                long msgtyp,//接收那个通道的消息
                int msgflg);//一般设置为0

  6.实例代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
typedef struct{
    long channel;
    char mtext[256];
}mf;
int main()
{
    mf mb; 
    int id=msgget(123,IPC_CREAT|0645);//创建消息队列
    memset(&mb,0x00,sizeof(mb));//初始化缓冲区
    printf("input channel:");
    scanf("%d",&mb.channel);
    char buf[]="pangdun is a beautiful girl";                                                                                         
    memcpy(mb.mtext,buf,sizeof(buf));
    msgsnd(id,(const void*)&mb,sizeof(buf),0);//写入数据
    printf("%s\n",mb.mtext);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/CY071512/article/details/80156967