4-2:IPC-消息队列

概述

- 消息队列可认为是一个消息链表
进程从其中读出消息,放入消息.
每个消息是一个记录[边界消息]
消息队列有随内核持续性

对比FIFO
FIFO必须同时有进程发出对其读打开,写打开请求时,才能打开.而消息队列不必.
FIFO最后一次关闭时,其上数据丢弃.消息队列即使关闭的.内核仍然维护消息队列对象及其数据.
FIFO是字节流消息[无边界]

每个消息:
1.有一个整数表示的优先级
2.消息数据部分长度,可为0
3.数据部分

mq_open,mq_close,mq_unlink

mqd_t mq_open(
	const char *name,
	// O_RDONLY, O_WRONLY, O_RDWR之一
	// 可能按位或上O_CREAT, O_EXCL或O_NONBLOCK
	int oflag,
	// mode_t mode, struct mq_attr* attr
	...);
int mq_close(mqd_t mqdes);
// 一个消息队列的名字的存在,也占用此队列的一个引用计数.
// mq_unlink将其名字从系统删除.相应的类似mq_close其引用计数因名字删除而减1
// 引用计数变为0,消息队列及其数据从系统删除
int mq_unlink(const char* name);

int mq_getattr(
	mqd_t mqdes, 
	struct mq_attr* attr);
int mq_setattr(
	mqd_t mqdes, 
	const struct mq_attr*attr,
	struct mq_attr *oattr);
struct mq_attr
{
    
    
	long mq_flags;
	// 下面两个只在创建队列时设置
	long mq_maxmsg;
	long mg_msgsize;
	// 只可获取
	long mq_curmsgs;
};

int mq_send(
	mqd_t mqdes,
	const char* ptr,
	size_t len,
	unsigned int prio);
// 按优先级返回
ssize_t mq_receive(
	mqd_t mqdes,
	char* ptr,
	// 不能小于能加到所指定队列中的消息的最大大小
	size_t len,
	unsigned int* priop);

mq_notify

Posix消息队列允许异步事件通知,以告知何时有一个消息放置到了某个空消息队列中。
- 产生一个信号
- 创建一个线程来执行一个指定的函数
int mq_notify(mqd_t mqdes, const struct sigevent *notification);

union sigval
{
    
    
	int sival_int;
	void *sival_ptr;
};

struct sigevent
{
    
    
	int sigev_notify;
	int sigev_signo;
	union sigval sigev_value;
	void (*sigev_notify_function)(union sigval);
	pthread_attr_t *sigev_notify_attributes;
};

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/110679411
4-2