QNX PPS服务是一个发布者可以修改其对象属性的系统。
订阅了对象的客户端在对象被更改时可以接收到更新通知,也就是说,当发布者修改了对象时,客户端就可感知到。
使用PPS,您的应用程序可以:
(1)向对象发布更改
(2)订阅对象以接收更改通知
(3)发布和订阅
一:对象文件(Object files)
在专用的PPS文件系统中 PPS对象被实现成了文件。默认情况下,PPS对象存放在/ PPS 目录下,但是这个路径同时也取决于启动PPS服务时使用的-m选项。PPS对象的实例不会超过一个,因此对该对象的更改对订阅者而言是立即可见的。
对象可以包含属性。每个属性都由对象文件中的一行文本来表示。例如,您可以发布一个名为Time的对象,它表示一天的时间,并且具有表示当前小时、分钟和秒的整数属性,如下所示:
在本例中,文件名是Time,每个属性都是该文件中的一个文本字符串。
由于PPS对象是由文件表示的,所以你可以进行以下操作:
1. 创建目录,并通过在这些目录中创建文件,使用PPS对象填充目录(当然为了创建对象,您需要在PPS目录或相应的子目录中具有写权限。)
2. 使用open(),然后使用read()和write()函数来查询和更改PPS对象。
3. 使用标准实用程序作为简单的调试工具。
为了避免在使用同一个PPS文件系统时,因集成了来自不同组织的应用程序可能出现的混乱或冲突,建议您使用您组织的web域名在PPS目录中创建您的目录。比如,域名为“QNX.com”的QNX软件文件系统时应该使用/pps/QNX,域名为“example.net”的组织应该使用/pps/example。
PPS对象是通过文件系统访问的,它们看起来像普通的POSIX文件。但是,它们不是标准的POSIX文件,而且一些PPS行为与标准的POSIX行为也不同。例如,分配的读缓冲区对于被读入的数据来说如果太小,那么读操作不会返回部分写入的结果;而是直接就是失败。
二:属性顺序(Attribute order)
PPS不保证将按照属性写入对象的顺序读取属性。也就是说,发布者(publisher)可以这样写:
订阅者可以按以下顺序读取
特殊的对象:
PPS目录中同时也可以包括一些特殊的对象,您可以打开这些对象来促进订阅行为。下表列出了这些特殊对象:
对象和目录大小:
因为PPS将其对象保存在内存中,所以它们很小。每个对象被分配32 kb。这并不意味着每个对象在运行时使用32kb的内存;它只使用内部表示其当前属性所需的内存量。
PPS目录和对象的数量仅受可用内存的限制。PPS目录的深度受到以下事实的限制:对象的完整路径名(文件存储在持久目录中);这些路径名的大小受所使用的持久文件系统所支持的最大文件名大小的限制。
三:变更通知(Change notification)
PPS在创建、删除或截断对象时通知发布者和订阅者。
当PPS创建、删除或截断一个对象(文件或目录)时,它会将一个通知字符串放入已为目录打开该对象或.all特殊对象的订阅者或发布者的队列中。
这个通知字符串的语法是一个特殊的字符前缀,紧跟在后面是对象标识符“@”,然后是对象名称,如下所示:
此外,当对象被删除时,PPS会向打开该对象的任何应用程序发送一个-@objectname。收到此通知的应用程序的典型行为是关闭打开的文件描述符,因为文件在文件系统中不再可见(POSIX行为)。
四:对象语法(Object syntax)
在PPS文件系统的列表中,PPS对象并没有特殊的标识符。也就是说,它们将与列表中的任何其他文件一样出现。例如,/ PPS /media目录中的PPS对象“PlayCurrent”将以简单的/ PPS /media/PlayCurrent的形式出现在文件列表中。
在PPS文件的读取结果中,第一行标识对象。这一行以“@”字符作为前缀,将其标识为对象名称。下面的行定义对象的属性。这些行都没有特殊的前缀。
假设上面示例中的PPS对象“PlayCurrent”包含描述多媒体应用程序中当前播放歌曲的元数据的属性。让我们假设属性的格式如下:
这个文件的open()调用和read()调用将返回对象的名称(文件名,带@前缀),然后是对象的属性值:
对象名称不能包含以下任何一种字符:"@"(@符号),"?"(问号),"/"(正斜杠),换行(ASCII LF),或ASCII NUL。
PPS对象中的每一行都以一个换行符(C中的“\n”或十六进制0A)结束,因此您必须以合作的客户端应用程序同意的方式对该字符进行编码。也就是说,任何包含ASCII LF或NULL字符的值都必须进行编码。编码字段可用于协助协作应用程序确定在值字段中使用何种编码。
五:属性语法(Attribute syntax)
PPS对象具有用户定义的属性。在PPS对象中,属性列在对象名称之后。
属性名可以由字母,数字字符、下划线和句点组成,但必须以字母或下划线开头。PPS对象文件中的属性行采用attrname:encoding:value\n的形式,其中attrname是属性名,encoding为值定义了编码类型。属性名的末尾和编码的末尾用冒号(":")标记。随后的冒号被忽略。
PPS不会解释编码;它只是将编码从发布者传递到订阅者。因此,发布者和订阅者可以自由地定义他们自己的编码来满足他们的需要。下表描述了可能的编码类型:
属性的值可以是任意字符序列,除了:
(1)NULL字符 ("\0" in C, or hexadecimal 0x00)
(2)换行符 ("\n" in C, or hexadecimal 0x0A)