问题 消息队列id 和键值KEY区别?

首先要注意一个概念:IPC结构都是内核的结构。也就是说IPC结构由内核维护,对于每个进程都是公共的,不属于某个特定进程。只有这样,IPC结构才能支持它们“进程间通信”的功能。

有两个东西可以标识一个IPC结构:标识符(ID)和键(key)。

Key是IPC结构的内部名。内部即在进程内部使用,这样的标识方法是不能支持进程间通信的。

ID就是IPC结构的外部名。这些进程得到的ID其实是标识了同一个IPC结构,如消息队列同时被进程A和进程B访问。多个进程间就可以通过这个IPC结构通信。

已知一个key,当希望利用这个key创建一个新的IPC时,可以使用get函数,并在flag中指定IPC_CREAT位,例如队列的情况,就是qid = msgget(key, IPC_CREAT)

一、基本概念

  • 消息队列就是一个消息的链表。一条消息可以看作一个有结构的记录。
  • IPC方式之一(进程间通信)
  • 消息可以通过结构类型区分

二、函数学习

2.1 创建消息队列

2.1.1 函数名
msgget
2.1.2 函数原型
int msgget(key_t key, int msgflg);
2.1.3 函数功能
打开或创建消息队列
2.1.4 头文件
  #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
2.1.5 返回值
success:the message queue identifier(消息队列ID)
error:-1

2.1.6 参数说明

key:键值
msgflg:打开标志. IPC_CREAT:标明新创建一个消息队列。
IPC_EXCL:标明打开一个消息队列

2.2 写消息

2.2.1 函数名
msgsnd
2.2.2 函数原型
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
2.2.3 功能
发送消息到消息队列
2.2.4 头文件
  #include <sys/ipc.h>
#include <sys/msg.h>
2.2.5 返回值
success:0
error:-1
2.2.6 参数说明
msqid:消息队列的ID
msgp:指向要发送的消息
msgsz:消息的长度(与结构有关,不含message type)
msgflg:标志位
P.S.General Form of message
       struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
}; The mtext field is an array (or other structure) whose size is speci-
fied by msgsz, a non-negative integer value.

2.3 读消息

2.3.1 函数名
msgrcv
2.3.2 函数原型
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
2.3.3 功能
从消息队列中接收消息
2.3.4 头文件
   #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
2.3.5 返回值
success:实际接收消息的数据长度
error: -1
2.3.6 参数
msqid:消息队列的id
msgp :存放取出的消息
msgsz:希望取到消息的最大长度
msgtyp:消息的类型
msgtyp = 0 ,忽略类型,直接取队列中的第一条
msgtyp >0, 取 消息队列中类型等于msgtyp的第一条消息
msgtyp <0, 取 类型比msgtyp的绝对值要小或者等于的消息,如果有多条消息满足该条件,则取类型号最小的一条。
If msgtyp is less than 0, then the first message in the queue with
the lowest type less than or equal to the absolute value of msgtyp
will be read. msgflg:标志

2.4 删除消息队列(控制)

2.4.1 函数名
msgctl
2.4.2 函数原型
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
2.4.3 函数功能
控制消息队列
2.4.4 头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
2.4.5 返回值
success:0
error :-1
2.4.6 参数说明
msqid:消息队列的id
cmd:操作命令,IPC_RMID 用于删除消息队列
buf :获取内核中的msqid_ds 结构

三、综合实例

发送
/* Send.c*/

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> struct msgbuf
{
long msgtype;
char msgtext[1024];
}; int main()
{ int msqid;
int msg_type;
char str[256];
struct msgbuf msgs; /* 创建消息队列 */
msqid = msgget(1024,IPC_CREAT); while (1)
{
printf("Please input message type,0 for quit!\n");
/* 获取消息类型 */
scanf("%d",&msg_type); /* 如果用户输入的消息类型为0,退出该循环 */
if (msg_type == 0)
break; /* 获取消息数据 */
printf("Please input message content!\n");
scanf("%s",str); msgs.msgtype = msg_type;
strcpy(msgs.msgtext,str); /* 发送消息 */
msgsnd(msqid,&msgs,sizeof(struct msgbuf),0); } /* 删除消息队列 */ msgctl(msqid,IPC_RMID,0);
return 0; }
接收
/* Receive.c*/

#include <stdio.h>
//#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h> /* 多进程-子进程 */ int msqid = 0; struct msgt
{
long msgtype;
char msgtext[1024];
}; /* 创建子线程 */
void childprocess()
{
struct msgt msgs;
while(1)
{
/* 接收消息队列 */
msgrcv(msqid,&msgs,sizeof(struct msgt), 0, 0); /* 打印消息队列中的数据 */
printf("message text: %s\n",msgs.msgtext);
} return;
} void main()
{ int i;
int cpid;
/* 打开消息队列 */ msqid = msgget(1024, IPC_EXCL);
/* 创建3个子进程 */
for(i=0;i<3;i++)
{
cpid = fork();//创建子线程???
if (cpid<0) printf("Creat childprocess ERROR\n"); else if(cpid == 0) childprocess(); } }

【Linux】IPC-消息队列的更多相关文章

  1. linux IPC 消息队列

    消息队列函数原型 在建立IPC通讯时(如消息队列,共享内存)必须建立一个ID值.通常情况下,这个ID值由ftok函数得到 #inlcude <sys/types.h> #include & ...

  2. linux IPC 消息队列(二)

    我在网上想找多进程之间的通信方式,发现有人写的消息队列很好,搬过来: common.h #ifndef __COMMON_H_ #define __COMMON_H_ #include <std ...

  3. IPC——消息队列

    Linux进程间通信——使用消息队列 下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管 ...

  4. 详解linux进程间通信-消息队列

    前言:前面讨论了信号.管道的进程间通信方式,接下来将讨论消息队列. 一.系统V IPC 三种系统V IPC:消息队列.信号量以及共享内存(共享存储器)之间有很多相似之处. 每个内核中的 I P C结构 ...

  5. Linux进程间通信—消息队列

    四.消息队列(Message Queue) 消息队列就是消息的一个链表,它允许一个或者多个进程向它写消息,一个或多个进程向它读消息.Linux维护了一个消息队列向量表:msgque,来表示系统中所有的 ...

  6. linux进程间通信-消息队列

    一 消息队列的介绍 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构. 我们可以通过发送消息来避免命名管道的 ...

  7. Linux进程间通信-消息队列(mqueue)

    前面两篇文章分解介绍了匿名管道和命名管道方式的进程间通信,本文将介绍Linux消息队列(posix)的通信机制和特点. 1.消息队列 消息队列的实现分为两种,一种为System V的消息队列,一种是P ...

  8. linux 下消息队列发送后没有信息

    在使用消息队列时,调用 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...

  9. linux中消息队列<一>

    1 概念 (1)链表式结构组织,存放于内核. (2)通过队列标识来引用. (3)通过一个消息类型来索引指定的数据 2 创建消息队列 #include <sys/msg.h> int msg ...

  10. linux进程间通信消息队列:msgsnd: Invalid argument

    今天写了个消息队列的小测试程序结果send端程序总是出现:msgsnd: Invalid argument,搞了半个小时也没搞明白,后来查资料发现我将(st_msg_buf.msg_type = 0; ...

随机推荐

  1. Mac下安装配置Python2和Python3并相互切换使用 转

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014259820/article/details/81023224 安装Python2 Mac系统 ...

  2. Python web前端 01 HTML常用标签

    Python web前端 01 HTML常用标签 一.HTML创建项目 file ---->new project -----> 输入项目名------>创建文件夹 new dicr ...

  3. 洛谷 P2680 运输计划(NOIP2015提高组)(BZOJ4326)

    题目背景 公元 \(2044\) 年,人类进入了宇宙纪元. 题目描述 公元\(2044\) 年,人类进入了宇宙纪元. L 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个 ...

  4. OJ 21658::Monthly Expense(二分搜索+最小化最大值)

        Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N< ...

  5. indexOf获取字符位置

    先定义一个字符串: var aString = "you are beautiful,so beautiful,and i love you ver much"; 拿到第一个逗号的 ...

  6. v-show, v-if, 以及动态组件的区别

    vue提供了v-if, v-show来动态显示隐藏组件 同时也提供了<component>元素在一个挂载点上动态的切换组件, 通过 is 来决定哪个组件被渲染显示 配合<keep-a ...

  7. docker 启动容器报错

    2018-10-24 报错信息: /usr/bin/docker-current: Error response from daemon: driver failed programming exte ...

  8. element-ui日期组件DatePicker设置日期选择范围Picker Options

    element-UI提供了DatePicker日期选择器组件,可以让我们很方便的获取到日期,默认的选择是全部的日期都可以选择的,但是很多场景中我们要对日期选择范围做限定,比如出行日期就不能选过去的日期 ...

  9. Java变量类型,实例变量 与局部变量 静态变量

    实例变量: 实例变量在类中声明,但在方法的外面,构造函数或任何块. 当空间分配给某个对象在堆中,插槽为每个实例变量创建值. 当一个对象与使用关键字 “new” 来创建,在对象被销毁销毁创建的实例变量. ...

  10. 06-struts2与ognl的结合

    1 参数接收 2 配置文件中 1 Demo2Action package www.test.c_config; import com.opensymphony.xwork2.ActionSupport ...