Linux 系统编程- 消息队列

目录

消息队列

消息队列概念

消息队列使用步骤

消息队列的使用

 打开/创建消息队列 msgget

发送消息 msgsnd 

 接收消息 msgrcv

 消息队列的控制


消息队列

消息队列概念

进程通讯的一种手段。

  • 消息队列是System V IPC对象的一种
  • 消息队列由消息队列ID来唯一标识
  • 消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息
  • 消息队列可以按照类型来发送、接受消息

消息队列使用步骤

  • 打开/创建消息队列 msgget
  • 向消息队列发送消息 msgsnd
  • 从消息队列接收消息 msgrcv
  • 控制消息队列 msgctl

消息队列的使用

发送端:

  1. 申请Key
  2. 打开/创建消息队列 msgget
  3. 向消息队列发送消息 msgsnd

接收端:

  1. 打开/创建消息队列 msgget
  2. 从消息队列接受消息 msgrcv
  3. 控制(删除)消息队列 msgctl

 打开/创建消息队列 msgget

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
 
int msgget(key_t key, int msgflg);

成功时返回消息队列的id,失败时返回EOF;key和消息队列关联的key IPC_PRIVATE或ftok;
msgflg 标志位 IPC_CREAT|0666 IPC_CREAT:没有创建,有则打开

发送消息 msgsnd 

#include <sys/ipc.h>
#include <sys/msg.h>

int msgsnd(int msgid,  const void*msgp, size_t size,  int msgflg);
成功时返回0,失败时返回-1
msgid 消息队列id
msgp 消息缓冲区地址 消息的地址 按结构体传入
size 消息正文长度
msgflg 标志位 0 或 IPC_NOWAIT

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>

typedef struct 
{
	long msg_type;
	char buf[128];
}msgT;

#define MSGLEN (sizeof(msgT)-sizeof(long))

int main(){
	key_t key;
	int msgid;
	int ret;
	msgT msg;
	key = ftok(".",100);
	if(key<0){
		perror("ftok");
		return 0;
	}
	msgid = msgget(key,IPC_CREAT|0666);
	if(msgid<0){
    		perror("msgget");
    		return 0;
	}
    //-------------------------写入内容1
	msg.msg_type = 1;
	strcpy(msg.buf,"this msg type 1");
	ret = msgsnd(msgid,&msg,MSGLEN,0);
	if(ret<0){
		perror("msgsnd");
		return 0;
	}
    //-------------------------
	msg.msg_type = 1;
	strcpy(msg.buf,"this msg type 1");
	ret = msgsnd(msgid,&msg,MSGLEN,0);
	if(ret<0){
		perror("msgsnd");
		return 0;
	}//-------------------------
	msg.msg_type = 2;
	strcpy(msg.buf,"this msg type 2");
	ret = msgsnd(msgid,&msg,MSGLEN,0);
	if(ret<0){
		perror("msgsnd");
		return 0;
	}//-------------------------
	msg.msg_type = 3;
	strcpy(msg.buf,"this msg type 3");
	ret = msgsnd(msgid,&msg,MSGLEN,0);
	if(ret<0){
		perror("msgsnd");
		return 0;
	}//-------------------------
	msg.msg_type = 4;
	strcpy(msg.buf,"this msg type 4");
	ret = msgsnd(msgid,&msg,MSGLEN,0);
	if(ret<0){
		perror("msgsnd");
		return 0;
	}
    
}

 接收消息 msgrcv

 #include <sys/ipc.h>
  #include <sys/msg.h>

int msgrcv(int msgid, void *msgp, size_t size ,long msgtype, int msgflg);
成功时返回收到消息长度,失败时返回-1
● msgid 消息队列id
● msgp 消息缓冲区地址
● size 指定接受的消息长度
● msgtype 指定接受的消息类型
● msgflg 标志位

 

 

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
	long msg_type;
	char buf[128];
}msgT;

#define MSGLEN (sizeof(msgT)-sizeof(long))

int main(){

	key_t key;
	int msgid;
	msgT msg;
	int ret;	
	key = ftok(".",100);
	if(key<0){
		perror("ftok");
		return 0;
	}
	msgid = msgget(key,IPC_CREAT|0666);
	if(msgid<0){
    		perror("msgget");
    		return 0;
	}
while(1){
	ret = msgrcv(msgid,&msg,MSGLEN,0,0);
	//ret = msgrcv(msgid,&msg,MSGLEN,3,0); 只接受msg_type=3

	if(ret<0){
		perror("msgrcv");
		return 0;
	}
}

	printf("receiv msg type=%d,buf=%s\n",(int)msg.msg_type,msg.buf);
}

 消息队列的控制

#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msgid, int cmd, struct msqid_ds *buf);
成功时返回0,失败时返回-1

 

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
	long msg_type;
	char buf[128];
}msgT;

#define MSGLEN (sizeof(msgT)-sizeof(long))

int main(){

	key_t key;
	int msgid;
	msgT msg;
	int ret;	
	key = ftok(".",100);
	if(key<0){
		perror("ftok");
		return 0;
	}
	msgid = msgget(key,IPC_CREAT|0666);
	if(msgid<0){
    		perror("msgget");
    		return 0;
	}
    int count = 0;
	while(1){
	ret = msgrcv(msgid,&msg,MSGLEN,0,0);
	//ret = msgrcv(msgid,&msg,MSGLEN,3,0); 只接受msg_type=3
	if(ret<0){
		perror("msgrcv");
		return 0;
	}
        count++;
        if(count>3)
        {break;}
	  printf("receiv msg type=%d,buf=%s\n",(int)msg.msg_type,msg.buf);
}
    //接收 后 清除  可通过ipcs查看
	ret = msgctl(msgid,IPC_RMID,NULL)
	if(ret<0){
        perror("msgctl");
        return 0;
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值