1.消息队列(queue)
版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.cnblogs.com/Dana-gx/p/9724545.html
一、基本概念
区别:
1> 避免命名管道的同步和阻塞问题

共享内存每列详解:
第一列就是共享内存的key; 第二列是共享内存的编号shmid;

五、system v下的消息队列接口函数:创建、发送、接受和删除
int msgget (key_t key, int msgflg);
msgrcv (int msqid, struct msgbuf *msgp, size_t msgsz,long msg_typ, int msgflg);
msgsnd (int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
int msgctl (int msqid, int cmd, struct msqid_ds *buf);
5.1 msgget函数 用来创建和访问一个消息队列 函数原型如下:
int msgget (key_t key, int msgflg);
key: 某个特定消息队列的键值
int msgsnd (int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
msgid: 由msgget函数返回的消息队列标识码
struct my_message{
long message_type; /* The data you wish to transfer*/
char text[size]; /*the data*/
};
msg_sz:是msg_ptr指向的消息长度,这个长度不能保存消息类型的那个“long int”长整型计算在内
5.3 msgrcv函数 函数原型如下:
int msgrcv(int msgid, void *msg_ptr, size_t msgsz, long int msgtype,int msgflg);
5.4 msgctl函数 控制消息队列,与共享内存shmctl相似 函数原型如下:
int msgctl(int msqid, int command, strcut msqid_ds *buf);
struct msgid_ds {
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
历程代码: 分为四个部分,创建消息队列、不同进程接收发和删除消息队列
1.创建key为0x1000的消息队列: msgget.c文件
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/ipc.h>
4 #include<sys/msg.h>
5 #include<stdlib.h>
6
7
8 int main(int argc, char *argv[])
9 {
10 int ret = msgget((key_t)0x1000, IPC_CREAT | IPC_EXCL | 0666);
11 if(ret == -1)
12 {
13 perror("msgget");
14 exit(EXIT_FAILURE);
15 }
16 printf("Message id = %d \n",ret);
17 return 0;
18 }
2.往0x1000消息队列写数据: msgsnd.c文件
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/ipc.h>
4 #include<sys/msg.h>
5 #include<string.h>
6 #include<stdlib.h>
7 #include<getopt.h>
8
9 typedef struct msgbuf
10 {
11 long mtype;
12 char mtext[1024];
13 }msgbuf_t;
14 int main(int argc, char* argv[])
15 {
16 int msgid = msgget((key_t)0x1000, 0);
17 if(msgid == -1)
18 {
19 perror("msgget");
20 exit(EXIT_FAILURE);
21 }
22 char c;
23 msgbuf_t msg= {-1,0};
24 while((c = getopt(argc, argv, "t:m:")) != -1)
25 {
26 switch(c)
27 {
28 case 't':
29 msg.mtype = atoi(optarg);
30 break;
31 case 'm':
32 strcpy(msg.mtext, optarg);
33 break;
34 default:
35 fprintf(stderr, "error option! \n");
36 printf("%s -t msgttpe -m message \n",argv[0]);
37 break;
38 }
39 }
40 if(msg.mtype > 0 && msg.mtext[0] != 0)
41 {
42 if(msgsnd(msgid, &msg, strlen(msg.mtext), 0) == -1)
43 {
44 perror("msgsnd");
45 exit(EXIT_FAILURE);
46 }
47 }
48 return 0;
49 }
3.从0x1000消息队列读数据: msgrcv.c文件
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/ipc.h>
4 #include<sys/msg.h>
5 #include<string.h>
6 #include<stdlib.h>
7 #include<getopt.h>
8
9 typedef struct msgbuf
10 {
11 long mtype;
12 char mtext[1024];
13 }msgbuf_t;
14
15 int main(int argc, char* argv[])
16 {
17 int msgid = msgget((key_t)0x1000, 0);
18 if(msgid == -1)
19 {
20 perror("msgget");
21 exit(EXIT_FAILURE);
22 }
23
24 char c;
25 msgbuf_t msg= {-1,0};
26 while((c = getopt(argc, argv, "t:m:")) != -1)
27 {
28 switch(c)
29 {
30 case 't':
31 msg.mtype = atoi(optarg);
32 break;
33 default:
34 fprintf(stderr, "error option! \n");
35 printf("%s -t msgttpe -m message \n",argv[0]);
36 break;
37 }
38 }
39 if(msg.mtype > 0 )
40 {
41 if(msgrcv(msgid, &msg, sizeof(msg)-5, msg.mtype, IPC_NOWAIT) == -1)
42 {
43 perror("msgsnd");
44 exit(EXIT_FAILURE);
45 }
46 printf("msgtype = %ld, msg = %s \n",msg.mtype,msg.mtext);
47 }
48 return 0;
49 }
4.删除消息队列: msgctl.c文件
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/ipc.h>
4 #include<sys/msg.h>
5 #include<stdlib.h>
6 #include<string.h>
7
8 int main(int argc, char* argv[])
9 {
10 int msgid = msgget((key_t)0x1000, 0);
11 if(msgid == -1)
12 {
13 perror("msgget");
14 exit(EXIT_FAILURE);
15 }
16 if(msgctl(msgid, IPC_RMID, NULL) == -1)
17 {
18 perror("msgctl");
19 exit(EXIT_FAILURE);
20 }
21 return 0;
22 }
Linux下运行过程如下:

1.消息队列(queue)的更多相关文章
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
- 消息队列Queue大全
消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...
- 消息队列queue
一.queue 在多线程编程中,程序的解耦往往是一个麻烦的问题,以及在socket网络编程中也会有这样的问题.recv 和send之间,如果服务端有消息,问题需要发送给客户端,而那边的recv 被主程 ...
- python消息队列Queue
实例1:消息队列Queue,不要将文件命名为"queue.py",否则会报异常"ImportError: cannot import name 'Queue'" ...
- python多进程之间的通信:消息队列Queue
python中进程的通信:消息队列. 我们知道进程是互相独立的,各自运行在自己独立的内存空间. 所以进程之间不共享任何变量. 我们要想进程之间互相通信,传送一些东西怎么办? 需要用到消息队列!! 进程 ...
- 【c#】队列(Queue)和MSMQ(消息队列)的基础使用
首先我们知道队列是先进先出的机制,所以在处理并发是个不错的选择.然后就写两个队列的简单应用. Queue 命名空间 命名空间:System.Collections,不在这里做过多的理论解释,这个东西非 ...
- day43-python消息队列二-queue模块
Python提供了Queue模块来专门实现消息队列Queue对象 Queue对象实现一个fifo队列(其他的还有lifo.priority队列,这里不再介绍).queue只有maxsize一个构造参数 ...
- 队列Queue:任务间的消息读写,安排起来~
摘要:本文通过分析鸿蒙轻内核队列模块的源码,掌握队列使用上的差异. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十三 消息队列Queue>,作者:zhushy . 队列(Queue)是 ...
- Java消息队列--ActiveMq 实战
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- Android消息队列和Looper
1. 什么是消息队列 消息队列在android中对应MessageQueue这个类,顾名思义,消息队列中存放了大量的消息(Message) 2.什么是消息 消息(Message)代表一个行为(what ...
随机推荐
- 如何在O(1)时间复杂度获取栈中最大值和最小值
问题描述: 如何在O(1)时间复杂度获取栈中的最大值和最小值? 问题分析: 普通栈规定的push(入栈).pop(出栈).peek(查看栈顶)等操作都只能在栈顶上操作,如果栈中元素是有序的,那么我们就 ...
- PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642
PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642 题目描述: "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大 ...
- [2020年10月28日普级组]1406.SMRTFUN
S M R T F U N SMRTFUN SMRTFUN 题目描述 "又肥又温顺,又大又笨,他们看起来那么傻,而且也不有趣--" 这些牛想要证明,他们是既有趣,又聪明的.为了这样 ...
- elementui 表格 如何使操作中隐藏一个按钮
<el-table-column label="权限"min-width="100"> <template scope="scope ...
- java面试-JVM内存结构
一.JVM内存结构 二.类加载(classLoader)机制 java中的ClassLoader详解 java类加载机制面试题 java类加载机制面试题 虚拟机把描述类的数据从Class文件加载到内存 ...
- 201871030115-康旭 实验二 软件工程个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客连接 课程班级 这个作业要求连接 作业链接 我的课程学习目标 (1)详细阅读<构建之法>第1章.第2章,掌握PSP流程:(2)设计实际程序掌握动态规划算法.回溯算法 ...
- 浙大MOOC《数据结构》随笔
第一讲 基本概念 1.1 什么是数据结构 图书摆放问题: 新书如何插入? 先定类别,再二分查找 怎么找到指定某本书? 二分查找 写程序实现一个函数PrintN 循环实现 void PrintN(int ...
- 04.ElementUI源码学习:组件封装、说明文档的编写发布
0x00.前言 书接上文.项目经过一系列的配置,开发脚手架已经搭建完毕.接下来开始封装自定义组件.并基于 markdown 文件生成文档和演示案例. 后续文章代码会根据篇幅,不影响理解的情况下进行部分 ...
- Day05_20_Java中类的创建和对象的实例化
类的创建和对象的实例化 类的定义 类属于引用数据类型,java语言中所有的.class都属于引用数据类型 在类体当中,方法体之外定义的变量被称为 成员变量,成员变量没有赋值,系统默认是0: 语法结构: ...
- HTTP 网络通讯过程
1. 网络模型概览 2. HTTP 网络通讯过程 1. 网络模型概览 OSI 先有模型,后有协议,先有标准,后进行实践:而 TCP/IP 则相反,先有协议和应用再提出了模型,且是参照的 OSI 模型. ...