//发送消息
#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;
}
Posix消息队列
最新推荐文章于 2022-08-04 23:16:49 发布