引入
POSIX消息队列, 它和原来学的System V消息队列(msgget、msgsnd, msgrcv)类似,都是用以队列的形式传递消息。接口主要有以下几个:
POSIX 与 System V消息队列对比:
System V消息队列:
主要函数(API):
头文件
#include <sys/msg.h>
int msgget(key_t key, int oflag)
int msgsnd(int msqid, constvoid * ptr, size_t length, int flag)
ssize_t msgrcv (int msqid, void*ptr, size_t length, long type, int flag)
int msgctl (int msqid, int cmd, struct msqid_ds *buf)
基本用法:
1.创建或获取消息队列:
使用msgget()函数来创建或获取一个消息队列。
该函数接受一个键(key)和一个标志(flag)作为参数。
如果键的值为IPC_PRIVATE或当前没有消息队列与给定键相关联,将会创建一个新的消息队列。
标志位可以用来指定权限组合。
2. 往消息队列中放入消息:
使用msgsnd()函数来往一个消息队列中放入一个消息。
该函数接受四个参数,分别为消息队列标识符、指向消息的指针、消息的大小以及标志位。
成功放入消息后,该函数返回0,否则返回-1并设置errno来表示错误原因。
3. 从消息队列中读取消息:
使用msgrcv()函数来从一个消息队列中读取一个消息。
该函数接受五个参数,分别为
消息队列标识符、指向消息的指针、消息的最大大小、消息的类型以及标志位。
成功读取消息后,该函数返回读取到的消息的大小,否则返回-1并设置errno来表示错误原因。
4. 控制消息队列:
使用msgctl()函数来对一个消息队列进行控制操作,如删除、设置权限等。
该函数接受三个参数,分别为消息队列标识符、操作命令以及一个可选的参数
=========================================================
POSIX 消息队列
主要函数(API)
头文件
#include <mqueue.h>
mqd_t mq_open(const char *name, int oflag,mode_t mode, struct mq_attr attr );
int mq_close(mqd_t mqdes);//
int mq_unlink(const char *name);
int mq_getattr(mqd_t mqdes, struct mq_attr *attr);
int mq_setattr(mqd_t mqdes, struct mq_attr *attr,struct mq_attr *oattr);
int mq_send(mqd_t mqdes, const char *ptr, size_tlen, unsigned int prio);
ssize_t mq_receive(mqd_t mqdes, char *ptr, size_tlen, unsigned int *prio);
int mq_notify(mqd_t mqdes, const struct sigevent*notification);
基本用法:
1.创建或打开消息队列:
使用mqd_t mq_open(constchar *name,int oflag,mode_t mode,struct mq_attr*attr);函数来创建或打开一个消息队列。
该函数接受队列名称、打开标志以及可选的权限和属性作为参数。
如果队列不存在且指定了创建标志,将会创建一个新的消息队列。
成功创建或打开后,函数返回一个消息队列描述符(mqd_t)。
2. 发送消息:
使用int mq_send(mqd_t mqdes,constchar *msg_ptr,size_t msg_len,unsigned intmsg_prio);函数来发送一个消息到指定的消息队列。
该函数接受消息队列描述符、指向消息的指针以及消息的大小作为参数。
发送消息时,可以指定消息的优先级,较高的优先级数值表示较高的优先级。
成功发送后,函数返回0,否则返回-1并设置errno来表示错误原因。
3. 接收消息:
使用ssize_t mq_receive(mqd_tmqdes, char *mdg_ptr,size_t msg_len,unsigned int*msg_prio);函数来从指定的消息队列中接收一个消息。
该函数接受消息队列描述符、指向接收缓冲区的指针以及缓冲区的最大大小作为参数。
接收消息时,可以选择按优先级接收,也可以选择非阻塞接收。成功接收后,函数返回接收到的消息的大小,否则返回-1并设置errno来表示错误原因。
4. 关闭消息队列:
使用int mq_close(mqd_t mqdes);函数来关闭一个已打开的消息队列。
该函数接受消息队列描述符作为参数。关闭消息队列后,相关的资源将被释放。
5. 删除消息队列:
使用int mq_unlink(const char*name);函数来删除一个已存在的消息队列。
该函数接受队列名称作为参数。删除一个消息队列将会移除与之关联的所有消息和状态.
2、3步可以改成下面的6、7、8步,支持异步通知:
6. 设置异步通知:
使用int mq_notify(mqd_tmqdes,const struct sigevent *notification);函数来注册一个进程以接收异步通知。
该函数接受消息队列描述符、一个指向sigevent结构的指针以及一个通知标志作为参数。
在sigevent结构中,可以设置当消息到达时要发送的信号或者要调用的回调函数。
通过设置用int mq_notify(mqd_t mqdes,const structsigevent *notification);,
当消息队列从空变为非空时,已注册的进程将收到一个信号或触发一个回调函数,以异步地通知该进程
7. 发送消息:
使用int mq_send(mqd_t mqdes,constchar *msg_ptr,size_t msg_len,unsigned intmsg_prio);函数来发送一个消息到指定的消息队列。
该函数接受消息队列描述符、指向消息的指针以及消息的大小作为参数。
发送消息时,可以指定消息的优先级,较高的优先级数值表示较高的优先级。成功发送后,函数返回0,否则返回-1并设置errno来表示错误原因。
8.处理异步通知:
<

最低0.47元/天 解锁文章
1015

被折叠的 条评论
为什么被折叠?



