c/c++ linux 进程间通信系列6,使用消息队列(message queue)

时间:2022-09-20 18:53:55

linux 进程间通信系列6,使用消息队列(message queue)

概念:消息排队,先进先出(FIFO),消息一旦出队,就从队列里消失了。

1,创建消息队列(message queue)

2,写消息到消息队列(message queue)

3,从消息队列(message queue)读消息

3,删除消息队列(message queue)

1,创建消息队列(message queue)

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h> int main(){
int msgid; msgid = msgget(IPC_PRIVATE, 0600);
if(msgid < 0){
perror("msgget");
return 1;
} printf("%d\n", msgid);
return 0;
}

github源代码

用下面的命令,能够查看到上面的程序创建的共享内存。

ipcs -q

执行后的结果:

------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 32768 ys 600 0 0

2,写消息到消息队列(message queue)

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h> #define MTEXTSIZE 10 int main(int argc, char* argv[]){
int msgid;
struct msgbuf{
long mtype;
char mtext[MTEXTSIZE];
}mbuf; if(argc != 2){
printf("wrong argc");
return 1;
} msgid = atoi(argv[1]); mbuf.mtype = 777;
memset(mbuf.mtext, 0, sizeof(mbuf.mtext));
mbuf.mtext[0] = 'A'; if(msgsnd(msgid, &mbuf, MTEXTSIZE, 0) != 0){
perror("msgsnd");
return 1;
} return 0;
}

github源代码

执行方法:【ipcs -q】执行后,得到下面的数字。

./a.out 789884

执行后:ipcs -q 发现, message下面的数字从0变为1了,说明消息队列里有了一个消息。

------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 32768 ys 600 10 1

3,从消息队列(message queue)读消息

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h> #define MTEXTSIZE 10 int main(int argc, char* argv[]){
int msgid, msgtype; struct msgbuf{
long mtype;
char mtext[MTEXTSIZE];
}mbuf; if(argc != 3){
printf("wrong argc");
return 1;
} msgid = atoi(argv[1]);
msgtype = atoi(argv[2]); if(msgrcv(msgid, &mbuf, MTEXTSIZE, msgtype, 0) <= 0){
perror("msgrcv");
return 1;
} printf("%c\n", mbuf.mtext[0]);
return 0;
}

github源代码

执行方法:必须指定在写入消息是的type,也就是777

./a.out 32768 777

执行后,ipcs -q发现,message下面的数字,由1变为0了,说明消息队列里没有消息了。

------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 32768 ys 600 0 0

4,删除消息队列(message queue)

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h> int main(int argc, char* argv[]){
int msgid;
msqid_ds mds; if(argc != 2){
printf("wrong argv\n");
return 1;
} msgid = atoi(argv[1]); if(msgctl(msgid, IPC_RMID, &mds) != 0){
perror("msgctl");
return 1;
} return 0;
}

执行方法:

./a.out 32768

执行后,ipcs -q发现,消息队列本身都没有了。

------ Message Queues --------
key msqid owner perms used-bytes messages

用命令行删除共享内存:【ipcs -q】执行后,得到下面的数字。

ipcrm -q id

github源代码

c/c++ 学习互助QQ群:877684253

c/c++ linux 进程间通信系列6,使用消息队列(message queue)

本人微信:xiaoshitou5854

c/c++ linux 进程间通信系列6,使用消息队列(message queue)的更多相关文章

  1. Linux进程间通信——使用System V 消息队列

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

  2. Linux:进程通信之消息队列Message实例

    /*send.c*/ /*send.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h&g ...

  3. c&sol;c&plus;&plus; linux 进程间通信系列5,使用信号量

    linux 进程间通信系列5,使用信号量 信号量的工作原理: 由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的: P(sv):如果sv的值大于零,就给它减1:如果 ...

  4. c&sol;c&plus;&plus; linux 进程间通信系列7,使用pthread mutex

    linux 进程间通信系列7,使用pthread mutex #include <stdio.h> #include <stdlib.h> #include <unist ...

  5. c&sol;c&plus;&plus; linux 进程间通信系列4,使用共享内存

    linux 进程间通信系列4,使用共享内存 1,创建共享内存,用到的函数shmget, shmat, shmdt 函数名 功能描述 shmget 创建共享内存,返回pic key shmat 第一次创 ...

  6. c&sol;c&plus;&plus; linux 进程间通信系列3,使用socketpair,pipe

    linux 进程间通信系列3,使用socketpair,pipe 1,使用socketpair,实现进程间通信,是双向的. 2,使用pipe,实现进程间通信 使用pipe关键点:fd[0]只能用于接收 ...

  7. c&sol;c&plus;&plus; linux 进程间通信系列2,使用UNIX&lowbar;SOCKET

    linux 进程间通信系列2,使用UNIX_SOCKET 1,使用stream,实现进程间通信 2,使用DGRAM,实现进程间通信 关键点:使用一个临时的文件,进行信息的互传. s_un.sun_fa ...

  8. c&sol;c&plus;&plus; linux 进程间通信系列1,使用signal,kill

    linux 进程间通信系列1,使用signal,kill 信号基本概念:  软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号.内核 ...

  9. 高并发架构系列:MQ消息队列的12点核心原理总结

    消息队列已经逐渐成为分布式应用场景.内部通信.以及秒杀等高并发业务场景的核心手段,它具有低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 无论是 RabbitMQ.RocketMQ.Act ...

随机推荐

  1. Another app is currently holding the yum lock&semi; waiting for it to exit&period;&period;&period;

    刚安装完虚拟机,用xshell连接上linux后,安装程序时一直出现这个信息Another app is currently holding the yum lock; waiting for it ...

  2. for循环和迭代

    迭代的一个时间复杂度最大就是n^2,而在for循环和迭代相结合的一个情况下则是一个排序组合,不再是一个简单n^2,而是阶乘n!.

  3. 使用FROM确认按钮&lpar;键盘13号键&rpar;提交特性并使用ajax&period;POST提交&period;

    如果又想使用FROM确认按钮(键盘13号键)提交特性  还能继续用AJAX.POST提交.就需要使用return false 来阻止FROM默认提交 代码如下: HTML页面 这里最关键就是用了ret ...

  4. nginx的负载均衡和反响代理配置

    4.        负载均衡配置 nginx 的 upstream默认是以轮询的方式实现负载均衡,这种方式中,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 另外 ...

  5. hdu 5063 Operation the Sequence

    http://acm.hdu.edu.cn/showproblem.php?pid=5063 思路:因为3查询最多50,所以可以在查询的时候逆操作找到原来的位置,然后再求查询的值. #include ...

  6. ecshop首页调用指定商品分类下的商品品牌列表

    转之--http://www.16css.com/ecshop/735.html 通过二次开发可以实现ECSHOP首页调用指定分类下的品牌列表. 第一步: 打开根目录下的index.php 在最后面 ...

  7. C&plus;&plus;中复制构造函数与重载赋值操作符

    我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类:   class CTe ...

  8. java 单元测试教程(junit)

    单元测试概念:最小化测试  比如说你想测试某个类中的一个方法 优点:无须启动整个程序 clipse使用junit教程: (一)配置jar: 1.右键工程选择Build Path 在二级菜单选择 Add ...

  9. &lbrack;Vue&rsqb; vuex进行组件间通讯

    vue 组件之间数据传输(vuex) 初始化 store src/main.js import Vuex from "vuex"; Vue.use(Vuex); new Vue({ ...

  10. CMake set 语法

    参考CMake官方文档:https://cmake.org/cmake/help/v3.14/command/set.html 1. 普通变量 set(<variable> <val ...