????????QNX PPS服務是一個發(fā)布者可以修改其對象屬性的系統(tǒng)缩功。
????????訂閱了對象的客戶端在對象被更改時可以接收到更新通知晴及,也就是說,當發(fā)布者修改了對象時嫡锌,客戶端就可感知到虑稼。
????????使用PPS,您的應用程序可以:
? ? ? ? (1)向?qū)ο蟀l(fā)布更改
? ? ? ? (2)訂閱對象以接收更改通知
? ? ? ? (3)發(fā)布和訂閱
一:對象文件(Object files)
? ? ?? 在專用的PPS文件系統(tǒng)中 PPS對象被實現(xiàn)成了文件势木。默認情況下蛛倦,PPS對象存放在/ PPS 目錄下,但是這個路徑同時也取決于啟動PPS服務時使用的-m選項啦桌。PPS對象的實例不會超過一個溯壶,因此對該對象的更改對訂閱者而言是立即可見的。
????????對象可以包含屬性甫男。每個屬性都由對象文件中的一行文本來表示且改。例如,您可以發(fā)布一個名為Time的對象板驳,它表示一天的時間又跛,并且具有表示當前小時、分鐘和秒的整數(shù)屬性若治,如下所示:
????????在本例中慨蓝,文件名是Time,每個屬性都是該文件中的一個文本字符串端幼。
? ? ?? 由于PPS對象是由文件表示的礼烈,所以你可以進行以下操作:
? ? ? ? 1. 創(chuàng)建目錄,并通過在這些目錄中創(chuàng)建文件静暂,使用PPS對象填充目錄(當然為了創(chuàng)建對象济丘,您需要在PPS目錄或相應的子目錄中具有寫權(quán)限。)
? ? ? ? 2. 使用open()洽蛀,然后使用read()和write()函數(shù)來查詢和更改PPS對象摹迷。
? ? ? ? 3. 使用標準實用程序作為簡單的調(diào)試工具。
? ? ? ?為了避免在使用同一個PPS文件系統(tǒng)時郊供,因集成了來自不同組織的應用程序可能出現(xiàn)的混亂或沖突峡碉,建議您使用您組織的web域名在PPS目錄中創(chuàng)建您的目錄。比如驮审,域名為“QNX.com”的QNX軟件文件系統(tǒng)時應該使用/pps/QNX鲫寄,域名為“example.net”的組織應該使用/pps/example。
????????PPS對象是通過文件系統(tǒng)訪問的疯淫,它們看起來像普通的POSIX文件地来。但是,它們不是標準的POSIX文件熙掺,而且一些PPS行為與標準的POSIX行為也不同未斑。例如,分配的讀緩沖區(qū)對于被讀入的數(shù)據(jù)來說如果太小币绩,那么讀操作不會返回部分寫入的結(jié)果;而是直接就是失敗蜡秽。
二:屬性順序(Attribute order)
????????PPS不保證將按照屬性寫入對象的順序讀取屬性。也就是說缆镣,發(fā)布者(publisher)可以這樣寫:
? ? ? ? 訂閱者可以按以下順序讀取
? ? ? ? 特殊的對象:
????????PPS目錄中同時也可以包括一些特殊的對象芽突,您可以打開這些對象來促進訂閱行為。下表列出了這些特殊對象:
????????對象和目錄大卸啊:
????????因為PPS將其對象保存在內(nèi)存中寞蚌,所以它們很小。每個對象被分配32 kb钠糊。這并不意味著每個對象在運行時使用32kb的內(nèi)存;它只使用內(nèi)部表示其當前屬性所需的內(nèi)存量挟秤。
? ? ?? PPS目錄和對象的數(shù)量僅受可用內(nèi)存的限制。PPS目錄的深度受到以下事實的限制:對象的完整路徑名(文件存儲在持久目錄中);這些路徑名的大小受所使用的持久文件系統(tǒng)所支持的最大文件名大小的限制眠蚂。
三:變更通知(Change notification)
????????PPS在創(chuàng)建煞聪、刪除或截斷對象時通知發(fā)布者和訂閱者。
????????當PPS創(chuàng)建逝慧、刪除或截斷一個對象(文件或目錄)時昔脯,它會將一個通知字符串放入已為目錄打開該對象或.all特殊對象的訂閱者或發(fā)布者的隊列中。
? ? ? ?這個通知字符串的語法是一個特殊的字符前綴笛臣,緊跟在后面是對象標識符“@”云稚,然后是對象名稱,如下所示:
????????此外沈堡,當對象被刪除時静陈,PPS會向打開該對象的任何應用程序發(fā)送一個-@objectname。收到此通知的應用程序的典型行為是關閉打開的文件描述符,因為文件在文件系統(tǒng)中不再可見(POSIX行為)鲸拥。
四:對象語法(Object syntax)
????????在PPS文件系統(tǒng)的列表中拐格,PPS對象并沒有特殊的標識符。也就是說刑赶,它們將與列表中的任何其他文件一樣出現(xiàn)捏浊。例如,/ PPS /media目錄中的PPS對象“PlayCurrent”將以簡單的/ PPS /media/PlayCurrent的形式出現(xiàn)在文件列表中撞叨。
????????在PPS文件的讀取結(jié)果中金踪,第一行標識對象。這一行以“@”字符作為前綴牵敷,將其標識為對象名稱胡岔。下面的行定義對象的屬性。這些行都沒有特殊的前綴枷餐。
????????假設上面示例中的PPS對象“PlayCurrent”包含描述多媒體應用程序中當前播放歌曲的元數(shù)據(jù)的屬性靶瘸。讓我們假設屬性的格式如下:
????????這個文件的open()調(diào)用和read()調(diào)用將返回對象的名稱(文件名,帶@前綴)尖淘,然后是對象的屬性值:
????????對象名稱不能包含以下任何一種字符:"@"(@符號)奕锌,"?"(問號),"/"(正斜杠)村生,換行(ASCII LF)惊暴,或ASCII NUL。
????????PPS對象中的每一行都以一個換行符(C中的“\n”或十六進制0A)結(jié)束趁桃,因此您必須以合作的客戶端應用程序同意的方式對該字符進行編碼辽话。也就是說,任何包含ASCII LF或NULL字符的值都必須進行編碼卫病。編碼字段可用于協(xié)助協(xié)作應用程序確定在值字段中使用何種編碼油啤。
五:屬性語法(Attribute syntax)
????????PPS對象具有用戶定義的屬性。在PPS對象中蟀苛,屬性列在對象名稱之后益咬。
????????屬性名可以由字母,數(shù)字字符帜平、下劃線和句點組成幽告,但必須以字母或下劃線開頭。PPS對象文件中的屬性行采用attrname:encoding:value\n的形式裆甩,其中attrname是屬性名冗锁,encoding為值定義了編碼類型。屬性名的末尾和編碼的末尾用冒號(":")標記嗤栓。隨后的冒號被忽略冻河。
????????PPS不會解釋編碼;它只是將編碼從發(fā)布者傳遞到訂閱者箍邮。因此,發(fā)布者和訂閱者可以自由地定義他們自己的編碼來滿足他們的需要叨叙。下表描述了可能的編碼類型:
屬性的值可以是任意字符序列锭弊,除了:
? ? (1)NULL字符 ("\0" in C, or hexadecimal?0x00)
? ? (2)換行符 ("\n" in C, or hexadecimal?0x0A)