进程间的通信之消息队列基本知识


前言

共享内存、消息队列和信号量三种通信方式合称 ----》SYSTME-V IPC通信(内部进程通信)

提示:以下是本篇文章正文内容,下面案例可供参考

一、引入

1.最大的特点:

可以选择性地读取消息队列中的内容

2.shell 命令

-----》查看消息队列 ipcs -q
---- 》删除消息队列 ipcrm -q 消息队列的id

3.特点

1) . 在读取消息队列中内容的时候可以选择性的读取(根据消息的类型来读取)
2). 如果消息队列中消息的类型一样,接收的时候只能按照发送的先后顺序去接收(跟队列的特点就一致了)
3). 如果接收的消息类型没有,会导致接收阻塞
4). 如果消息队列不删除,接收消息的时候,那些没有接收的消息依然在队列中存放着。

二、相关的接口函数

1.申请消息队列

            #include <sys/msg.h>
              int msgget(key_t key, int msgflg);
               返回值:成功返回消息队列的id
                             失败  -1
               参数:跟共享内存一样

2.使用消息队列

发送信息到消息队列中
    int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
        参数:msgp --》你要发送的内容
                   msgsz--》你打算发送多少字节的数据
                   msgflg--》设置0

注意:msgp要发送的内容需要封装成一个结构体

			struct  名字
            {
                      long  msgtype; //标记消息的类型
                      char  msg[20];      //真实的信息
            };

从消息队列中接收信息

	ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,  int msgflg);
                                        参数:msgtyp(重点,重点) --》消息的类型

3.删除消息队列,获取修改消息队列的属性

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
     参数:cmd --》IPC_STAT   获取消息队列的属性信息
                             IPC_SET      设置消息队列的属性信息
                             IPC_RMID  删除消息队列
             struct msqid_ds --》存放你获取或者设置的消息队列的属性
             {
                  属性;
             }

三、代码实现

1.消息队列的发送

#include "myhead.h"

/*
	消息队列的发送
*/

//自定义一个结构体存放要发送的内容
struct mymsg
{
	long msgtype;  //消息类型
	char msg[50];  //真实的消息 
}; 
 
int main()
{
	int msgid;
	
	//申请消息队列
	msgid = msgget(98787,IPC_CREAT|IPC_EXCL|0777);
	if(msgid == -1){
		if(errno == EEXIST){
			msgid = msgget(98787,0777);
		}
		else{
			perror("msgget");
			return -1;
		}
	} 
	
	struct mymsg msg1;
	bzero(&msg1,sizeof(struct mymsg));
	msg1.msgtype = 33;
	strcpy(msg1.msg,"hahahahaha");
	
	struct mymsg msg2;
	bzero(&msg2,sizeof(struct mymsg));
	msg2.msgtype = 66;
	strcpy(msg2.msg,"lalalalala");
	
	struct mymsg msg3;
	bzero(&msg3,sizeof(struct mymsg));
	msg3.msgtype = 99;
	strcpy(msg3.msg,"hehehehehe");
	
	//往消息队列中发送三条消息
	msgsnd(msgid,&msg1,sizeof(msg1),0);
	msgsnd(msgid,&msg2,sizeof(msg2),0);
	msgsnd(msgid,&msg3,sizeof(msg3),0); 
	
	
}

2.消息队列的接收

#include"myhead.h"

/*
	消息队列的接收
*/

//自定义一个结构体存放要发送的内容
struct mymsg
{
	long msgtype;  //消息类型
	char msg[50];  //真实的消息 
}; 

int main()
{
	int msgid;
	//申请消息队列
	msgid = msgget(98787,IPC_CREAT|IPC_EXCL|0777);
	if(msgid == -1){
		if(errno == EEXIST){
			msgid = msgget(98787,0777);
		}
		else{
			perror("megget");
			return -1;
		}
	}	
	
	struct mymsg othermsg;
	bzero(&othermsg,sizeof(struct mymsg));
	
	//接收消息
	msgrcv(msgid,&othermsg,sizeof(othermsg),66,0);
	printf("I specify to receive messages of type 66 : %s\n",othermsg.msg); 
	
} 

3.头文件

#ifndef _MYHEAD_H_
#define _MYHEAD_H_

//自定义的头文件,用来包含其他常用的头文件
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h> 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include<sys/mman.h>
#include<errno.h>
#include <signal.h> 
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/msg.h> 

#endif 

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了进程间的通信方式其中一个----》消息队列。其他内容请各位大神移步本博客的其他文章,或是留言并关注博主,等待后续发布。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值