UNIX网络编程卷二 笔记 Posix消息队列

19 篇文章 0 订阅
5 篇文章 0 订阅

第2章 Posix消息队列

2.1 概述

每个消息都是一个有优先级的记录,进程写入消息前,不需要有其它进程在等待消息。消息队列具有随内核的持续性。

Posix消息队列与System V消息队列的两个主要区别:

1. Posix读返回最高优先级的最早消息,System V返回指定优先级的最早消息。

2. 向空队列放置一个消息时,Posix可以产生一个信号或启动一个线程。

2.2 功能函数

mq_open:打开或创建消息队列,除了可选的attr参数外,与open类似。

mq_close:关闭消息队列,与close类似。

mq_unlink:带引用计数的删除,与unlink类似。

mq_getattrmq_setattr函数:获取和设置消息队列的属性。


    struct mq_attr { 
    long mq_flags; //0或O_NONBLOCK,唯一能被setattr设置的属性 
    long mq_maxmsg;  //最大消息数,创建时指定 
    long mq_msgsize; //最大消息长度,创建时指定 
    long mq_curmsgs; //当前消息数,只能获取不能修改 
}

2.3 mq_sengmq_receive


    int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio); 
ssize_t mq_receive(mqd_t mqdes, const char *ptr, size_t len, unsigned int *priop);

mq_receivelen参数不能小于消息队列的mq_msgsize的大小。

Posix允许长度为0的消息,但不具备有效标识消息发送者的特性。

2.4 消息队列的限制

1. mq_maxmsg 最大消息数。

2. mq_msgsize 最大消息长度。

3. MQ_OPEN_MAX 同时打开的消息队列的最大数目。

4. MQ_PRIO_MAX 优先级的最多级数。

2.5 mq_notify

mq_notify提供了异步事件通知功能,在某个空消息队列被放置一条消息时,会向注册的进程发送指定信号或启动一个线程。


    int mq_notify(mqd_t mqdes, const struct sigevent *notification);

1. 一个队列在任意时刻只有一个进程能够注册这个通知。

2. 只有当前注册通知的进程可以撤销这个注册,方法是传入一个空指针。

3. mq_receive而阻塞的进程比注册了通知的进程优先获得消息。

4. 通知被发送到注册进程后,该注册被撤销。

2.6 Posix实时信号

Posix实时信号指值在SIGRTMINSIGRTMAX之间的一系列信号,在sigaction调用中指定SA_SIGINFO标志的话,实时信号能提供一些有保证的、可靠的实时行为。

实时行为隐含特性:

1. 信号是排队的,阻塞期间同一信号产生多次,那么解除阻塞后该信号会递交多次。

2. 多个实时信号排队时,值较小的信号优先递交。

3. 实时信号能携带更多信息。

4. 有使用实时信号工作的新函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值