c/c++ linux 进程间通信系列6,使用消息队列(message queue)
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;
}
用下面的命令,能够查看到上面的程序创建的共享内存。
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;
}
执行方法:【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;
}
执行方法:必须指定在写入消息是的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
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ linux 进程间通信系列6,使用消息队列(message queue)的更多相关文章
- Linux进程间通信——使用System V 消息队列
消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问 ...
- Linux:进程通信之消息队列Message实例
/*send.c*/ /*send.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h&g ...
- 浅谈消息队列 Message Queue
消息队列:在消息传递的过程中暂时保存消息的容器,充当发送者和接受者的中间人 消息队列的基本操作 using System; using System.Messaging; namespace MQ { ...
- c/c++ linux 进程间通信系列5,使用信号量
linux 进程间通信系列5,使用信号量 信号量的工作原理: 由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的: P(sv):如果sv的值大于零,就给它减1:如果 ...
- c/c++ linux 进程间通信系列7,使用pthread mutex
linux 进程间通信系列7,使用pthread mutex #include <stdio.h> #include <stdlib.h> #include <unist ...
- c/c++ linux 进程间通信系列4,使用共享内存
linux 进程间通信系列4,使用共享内存 1,创建共享内存,用到的函数shmget, shmat, shmdt 函数名 功能描述 shmget 创建共享内存,返回pic key shmat 第一次创 ...
- c/c++ linux 进程间通信系列3,使用socketpair,pipe
linux 进程间通信系列3,使用socketpair,pipe 1,使用socketpair,实现进程间通信,是双向的. 2,使用pipe,实现进程间通信 使用pipe关键点:fd[0]只能用于接收 ...
- c/c++ linux 进程间通信系列2,使用UNIX_SOCKET
linux 进程间通信系列2,使用UNIX_SOCKET 1,使用stream,实现进程间通信 2,使用DGRAM,实现进程间通信 关键点:使用一个临时的文件,进行信息的互传. s_un.sun_fa ...
- c/c++ linux 进程间通信系列1,使用signal,kill
linux 进程间通信系列1,使用signal,kill 信号基本概念: 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号.内核 ...
随机推荐
- Qt创建分割窗口
1.QT中QSplitter类可以用来灵活分割窗口,从而产生可用的布局,在以后进行界面布局很有用. 2.先看代码,这个分割窗口按顺序添加子窗口: #include "mainwindow.h ...
- 【mysql】mysql 调优之 ——执行计划 explain
1.what is explain(explain 是个什么东东) explain(解释),在 Mysql 中 作为一个关键词,用来解释 Mysql 是如何执行语句,可以连接 select .dele ...
- C#使用Windows Service
前言:Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新 ...
- Redis的应用场景
最近做了个小项目是WebForm 做着做着发现前台的首页读取速度很慢,并且多个用户同时访问我的Sqlserver承受不住!之后就想到了Redis 代码如下: /// <summary> / ...
- 设计模式java实现合集
http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 桥接模式:http://blog.csdn.net/jason05 ...
- Android:谈一谈安卓应用中的Toast情节(基础)
前言 Toast,这个曾经也是现在正在迷倒万千软件开发者尤其是android开发者的小美女,向来不乏在各个明星应用中频繁登场.Toast是神马~听说是一种吐司面包,能吃吗?如果手机屏幕是巧克力做的,我 ...
- 【微信小程序云开发】从陌生到熟悉
前言 微信小程序在9月10号正式上线了云开发的功能,弱化后端和运维概念,以前开发一个小程序需要申请一个小程序,准备一个https的域名,开发需要一个前端一个服务端,有了云开发只有申请一个小程序,一个前 ...
- API网关模式
什么是网关 网关一词来源于计算机网络中的定义,网关(Gateway)又称网间连接器.协议转换器.网关的准确定义是: 两个计算机程序或系统之间的连接,网关作为两个程序之间的门户,允许它们通过不同计算机之 ...
- leetcode — reverse-linked-list-ii
/** * Source : https://oj.leetcode.com/problems/reverse-linked-list-ii/ * * * Reverse a linked list ...
- [二十二]JavaIO之LineNumberReader
功能介绍 LineNumberReader是提供了行号的具体的装饰器类 跟踪行号的缓冲字符输入流 此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用 ...