Posix消息队列

书本阿,每看一次,都会有新的知识看到。


一.IPC前言总概述:
1.名字是客户与服务器彼此连接以交换消息的手段。
2.IPC共同属性:路径名、打开或创建时指定的标志以及访问权限
3.注意:Solaris要求有斜杠打头的路径名/,比如/queue.1234 ==> 则会在/tmp/.MQDqueue.123、/tmp/.MQLqueue.1234 /tmp/.MQPqueue.1234, date lock p...权限
      当是在其他linux/unix上则按照路径名来创建,/queue.1234 ==> /queue.1234,这样就要求具有根目录的权限。因此,我们需要做好兼容性的处理(定义宏等),因为不是所有软件都是只拿给root用户使用的。
4.posix创建与打开ipc方法:mq_open(可以任意模式打开),sem_open(不指定打开模式,因为对信号量的操作都是要读写的),shm_open(不能以只写模式打开)
(打开标志)O_CREAT,O_EXCL(存在则返回错误),O_NONBLOCK(非阻塞),O_TUNC(如果已经存在该内存共享区,那么该标志将使得该对象的长度被截成0),S_IRUSR,S_IWUSR,S_IRGRP,S_IWGRP,S_IROTH,S_IWOTH(权限位)
, O_RDONLY,O_WRONLY,O_RDWR
5.3种类型的posixIPC,消息队列,信号量,共享内存区都是用路径名标识的。open时打开的权限设置以S_XXX开头,与打开文件时的权限测试是一样的。
6.SystemVIPC,key_t,ftok,ipc键值。路径名用于产生键值的文件不能在服务器存活期间由服务器反复创建并删除文件,必须要稳定哦。因为每次创建都会改变索引节点,对于下一个调用者来说,ftok的建就不同了。
----------------------
7.ipc_perm结构:每个ipc对象(消息队列,内存共享,信号量)维护一个信息结构:(定义在:sys/ipc.h)------->SystemV的也是定义在这里。
struct ipc_perm{
uid_t uid; gid_t gid; uid_t cuid; gid_t cgid; mode_t mode; ulong_t seq; ket_t key;
};
8.ipcs ipcrm 
9.内核限制:1.该配置文件 2.通过sysconfig命令来改。往往内核限制比较小,那是因为以前开发定义的时候,配置低,不如当今水平。
使用SystemVIPC的最大问题在于多数实现在这些对象的大小上施加了人为的内核限制。


二。管道:pipe popen close witepid pclose mkfifo fork 


三。Posix消息队列
1.消息队列可以认为是一个消息链表,只要有足够的权限
2.posix与systemV差别
1.posix总是返回最高优先级的最早消息,systemv则可以指定任意优先级消息
2.往一个空队列放置消息时,posix允许产生一个信号或一个线程,而systemv不可以
3.每个消息属性:1.类型,数据部分的长度,数据本身
4.每个队列有自己的链表头消息:里面有该队列的2个属性,1,最大消息大小 2.最大消息数
5.属性struct mq_attr { flag阻塞标志位,maxmsg,msgsize,curmsgs),设定属性的时候必须同时谁的那个maxmsg,msgsize
6.优先级:小于宏:MQ_PRIO_MAX,
7.mq_notify函数,发送信号 或者 启动线程
8.信号注册函数的执行(由内核执行,切换到内核态执行)会阻塞主线程的执行,知道函数返回,主线程才继续执行。且,在注册函数中只能调用"异步信号安全的函数"。
9.posix实时信号的使用:会排队不丢失;优先级,小的先上;能携带更多信息。


注:新的应用程序应考虑使用posix消息队列;posix消息队列相对于systemV缺失的主要特性是从队列中读出指定优先级的消息能力。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值