Posix消息队列

//发送消息
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#define ERR_EXIT(m) \
		do \
		{ \
			perror(m); \
			exit(EXIT_FAILURE); \
		}while(0)

int main(void)
{
	mqd_t mqid;//Posix消息队列的文件描述符
	//创建消息队列
	// makefile需要链接一个库  link with -lrt
	//需要挂在到一个目录下,才能看见abc
	//mkdir /dev/mqueue
	//mount -t mqueue none /dev/mqueue
	mqid = mq_open("/abc", O_CREAT | O_RDWR, 0666, NULL);
	if(mqid == (mqd_t)-1)
		ERR_EXIT("mq_open");
	
	//获取消息队列属性
	struct mq_attr attr;
	mq_getattr(mqid, &attr);
	//打印队列最多容纳消息数,一个消息最多字节数,现在消息队列中消息数
	printf("max #msg=%ld max #byte/msg=%ld #currently on queue=%ld\n",
		attr.mq_maxmsg,attr.mq_msgsize,attr.mq_curmsgs);

	//发送学生数据
	struct stu{
		char name[20];
		int age;
	}STU;
	STU stu1;
	strcpy(stu.name, "xiaoming");
	stu1.age = 10;
	unsigned prio = 0;//设置优先级
	mq_send(mqid, (const char*)&stu1, sizeof(stu1),prio);


	//关闭消息队列
	mq_close(mqid);
	//删除消息队列
	//mq_unlink("/abc");
	return 0;
}
//接收消息
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#define ERR_EXIT(m) \
		do \
		{ \
			perror(m); \
			exit(EXIT_FAILURE); \
		}while(0)
/*mq_notify注意事项,只有一个进程能注册接受通知
		接受通知的前提,进程没有任何线程阻塞在mq_notify之前
		mq_notify需在mq_receive之前执行,否则会在mq_receive过程中有消息进入而无法注册通知
		*/
mqd_t mqid;
size_t size;//消息字节大小
struct sigevent sigev;//接受通知的结构体
void handle_sigusr1(int sig)
{
	mq_notify(mqid,&sigev);//下一次收取消息,都需要在mq_receive之前重新注册通知
							//才能使下一次消息到达时有通知
	struct stu{
		char name[20];
		int age;
	}STU;
	//接受数据,接受消息队列中最高优先级的最早消息
	STU stu2;
	unsigned prio;
	if(mq_receive(mqid, (char*)&stu2, size, &prio) ==(mqd_t)-1)
		return -1;
	printf("name=%s\n age=%d prio=%u\n", stu2.name,stu2.age, prio);
}
int main(void)
{
	
	//创建消息队列
	mqid = mq_open("/abc", O_RDONLY, 0666, NULL);
	if(mqid == (mqd_t)-1)
		ERR_EXIT("mq_open");
	
	//获取属性
	struct mq_attr attr;
	mq_getattr(mqid, &attr);
	size = attr.mq_msgsize;
	//打印队列最多容纳消息数,一个消息最多字节数,现在消息队列中消息数
	printf("max #msg=%ld max #byte/msg=%ld #currently on queue=%ld\n",
		attr.mq_maxmsg,attr.mq_msgsize,attr.mq_curmsgs);


	//有消息需接受,利用信号进行通知
	signal(SIGUSR1, handle_sigusr1);
	
	sigev.sigev_notify = SIGEV_SIGNAL;
	sigev.sigev_signo = SIGUSR1;
	
	mq_notify(mqid,&sigev);//注册通知


	//关闭消息队列
	mq_close(mqid);
	//删除消息队列
	//mq_unlink("/abc");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值