一文带你入门POSIX消息队列

引入

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.处理异步通知:

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值