【QNX】pps開發(fā)指南(6):選項(xiàng)和限定符

PPS允許您在打開對(duì)象時(shí)使用各種路徑名選項(xiàng)。PPS使用這些路徑名選項(xiàng)打開對(duì)象的文件描述符。PPS還允許您使用限定符來(lái)指定對(duì)象或?qū)傩砸獔?zhí)行的操作(例如,使對(duì)象非持久或刪除一個(gè)屬性)。

一:路徑名打開選項(xiàng)

PPS對(duì)象對(duì)用于打開它們的路徑名支持?jǐn)U展語(yǔ)法。

打開選項(xiàng)通常被添加為路徑名的一個(gè)后綴,跟隨再問(wèn)號(hào)(" ? ")后面,多個(gè)選項(xiàng)用逗號(hào)分隔。例如:

"/pps/media/PlayList" — open the PlayList file with no options
"/pps/media/PlayList?wait" — open the PlayList file with the wait option
"/pps/media/Playlist?wait,delta" — open PlayList file with the wait and delta options
"/pps/media/.all?wait" — open the media directory with the wait option
"/pps/fish?notify=345:water" — open fish and associate it with .notify group 345

熟悉getsubopt()庫(kù)例程的任何人都很容易識(shí)別用于指定PPS pathname開放查詢選項(xiàng)的語(yǔ)法。

支持的路徑名選項(xiàng)包括以下內(nèi)容:

backlog=num_kb
在刷新OCB(打開控制塊)之前要保留的最大增量大小(以KB為單位)。如果不指定此選項(xiàng),或者指定值為0,則使用默認(rèn)的待定值256 KB;您可以在啟動(dòng)pps時(shí)指定-d選項(xiàng)來(lái)覆蓋它。flow和backlog選項(xiàng)是互斥的。
如果累計(jì)增量超過(guò)num_kb,則生成清除通知,其形式為:
|@objname

cred
輸出對(duì)象的憑據(jù)。只能將此選項(xiàng)與flow或server選項(xiàng)結(jié)合使用。當(dāng)新客戶端連接到server或flow對(duì)象時(shí),連接通知還包含客戶端憑據(jù),形式如下:
+@objname.client_id.nnode_id.pprocess_id.uuser_id.ggroup_id.g...

critical
將發(fā)布服務(wù)器指定為該對(duì)象的關(guān)鍵級(jí)

crypt=domain
為該對(duì)象設(shè)置密碼域。為了使用此選項(xiàng),必須使用-p選項(xiàng)啟動(dòng)pps服務(wù),該選項(xiàng)指定了掛載的電源安全(fs-qnx6.so)分區(qū)上的持久存儲(chǔ)位置,該分區(qū)包含加密域。
將PPS對(duì)象分發(fā)給域意味著當(dāng)它被保存在持久存儲(chǔ)中時(shí),它將被放入指定的加密域。例如,以下代碼:

open(“/pps/test_obj?crypt=10”, O_CREAT, 0666)

當(dāng)test_obj PPS對(duì)象保存在持久存儲(chǔ)中時(shí),將其分配給加密域10。
如果為具有不同加密域的同一個(gè)PPS對(duì)象打開多個(gè)文件描述符,則使用最后一個(gè)。在下面的例子中,使用的域是11:

fd1 = open(“/pps/test_obj”, O_RDWR|O_CREAT, 0666);
fd2 = open(“/pps/test_obj?crypt=10”, O_RDWR, 0666);
fd3 = open(“/pps/test_obj?crypt=11”, O_RDWR, 0666);

delta
使用增量模式打開對(duì)象

deltadir
返回目錄中所有對(duì)象(文件)的名稱(僅對(duì)目錄中特殊的.all對(duì)象有效)。
如果目錄中的任何對(duì)象被創(chuàng)建或刪除,這些更改將通過(guò)在其名稱前加上“+”(創(chuàng)建)或“-”(刪除)符號(hào)來(lái)表示。這種行為允許您在PPS中有效地執(zhí)行readdir()并監(jiān)視文件系統(tǒng)的更改,而不必同時(shí)監(jiān)視屬性的更改。

f=filter ...
根據(jù)對(duì)列出的屬性的更改在通知中放置過(guò)濾器。

flow[=num_kb]
將該對(duì)象視為server對(duì)象,并帶有清除和溢出(overflow)通知。num_kb指定了backlog的最大值,單位是KB。如果不指定num_kb,或者指定值為0,則使用默認(rèn)的backlog大小256 KB;您可以在啟動(dòng)pps時(shí)指定-d選項(xiàng)來(lái)覆蓋它。溢出overflow通知的格式為:
^@objname
flow選項(xiàng)和backlog選項(xiàng)是互斥的。您可以使用帶有flow的hiwater選項(xiàng)來(lái)生成溢出overflow通知。

hiwater=hw_percent
指定flow的高位標(biāo)記占整個(gè)Client backlog的百分比。如果積壓超過(guò)這個(gè)百分比,就會(huì)生成溢出通知。當(dāng)累計(jì)的增量大小超過(guò)指定積壓的hw_percent時(shí),會(huì)為每個(gè)緩沖的增量生成溢出通知。溢出通知的格式為:
^@objname
您可以指定范圍從1到99%的值;如果您沒有指定此選項(xiàng),則使用默認(rèn)的100%。您只能將hiwater選項(xiàng)與flow選項(xiàng)結(jié)合使用。

nopersist
使對(duì)象非持久。當(dāng)系統(tǒng)重新啟動(dòng)時(shí),該對(duì)象將不存在。默認(rèn)設(shè)置是所有對(duì)象都是持久的,并在重啟時(shí)重新加載。

notify=id:value
將打開的文件描述符與id指定的通知組相關(guān)聯(lián)。當(dāng)從PPS掛載點(diǎn)根目錄的.notify文件的open()中第一次讀取時(shí)返回這個(gè)id。value是要與組關(guān)聯(lián)的任意字符串。
每當(dāng)用notify=查詢打開的文件描述符上有可用數(shù)據(jù)時(shí),.notify文件的讀取將返回字符串id:value。

opens
當(dāng)打開計(jì)數(shù)發(fā)生變化時(shí)更新_open::rd,wr屬性。此選項(xiàng)允許接收有關(guān)為寫入和讀取對(duì)象打開的文件描述符數(shù)量的通知。通知的格式如下:
%@objname.read_count,write_count
每當(dāng)讀取器或?qū)懭肫鞯臄?shù)量發(fā)生變化時(shí),都會(huì)發(fā)送通知。這些數(shù)字在每次調(diào)用open()時(shí)增加,在調(diào)用close()時(shí)減少。O_RDONLY增加讀取器的數(shù)量,O_WRONLY增加寫入器的數(shù)量,O_RDWR增加讀取器和寫入器的數(shù)量。例如,如果您使用以下代碼創(chuàng)建PPS對(duì)象:
fd = open(“/pps/test_obj?opens”, O_CREAT|O_RDWR, 0666);
然后從這個(gè)文件描述符讀取后,接收到以下通知:
%@test_obj.1,1
如果您使用O_WRONLY打開相同的PPS對(duì)象,那么將生成以下通知:
%@test_obj.1,2

reflect
將此對(duì)象上所做的屬性更改反射回該對(duì)象。

server
將publisher指定為對(duì)象的“server”。

verbose[=level]
設(shè)置此對(duì)象的詳細(xì)級(jí)別。如果指定此選項(xiàng)時(shí)不帶參數(shù),則級(jí)別為9(最高)。

wait
打開文件并清除O_NONBLOCK標(biāo)志,以便read()調(diào)用一直等待,直到對(duì)象更改或出現(xiàn)增量。

2. 關(guān)鍵選項(xiàng)

可以使用關(guān)鍵選項(xiàng)作為在publisher異常終止時(shí)清理屬性的機(jī)制。

如果在打開文件描述符進(jìn)行寫操作時(shí)使用此選項(xiàng),那么當(dāng)文件描述符關(guān)閉時(shí),PPS將刪除所有非持久性屬性,并在發(fā)送給所有訂閱者的通知字符串中在對(duì)象名稱前加上星號(hào)(" * ")。PPS不提供已刪除屬性的列表

對(duì)于任何一個(gè)PPS對(duì)象,都不應(yīng)該有一個(gè)以上的關(guān)鍵文件描述符。

文件描述符可以顯式復(fù)制(通過(guò)dup()、dup2()、fcntl()等),也可以隱式復(fù)制(通過(guò)fork()、spawn()等)。重復(fù)的描述符實(shí)際上增加了基礎(chǔ)關(guān)鍵描述符上的引用計(jì)數(shù)。關(guān)鍵對(duì)象所需的行為(volatile屬性的通知和刪除)直到文件描述符的引用計(jì)數(shù)下降到零時(shí)才會(huì)被觸發(fā),表明原始的和所有重復(fù)文件描述符都已被關(guān)閉。

但是,如果在關(guān)鍵模式下多次打開PPS對(duì)象,則每個(gè)文件描述符都作為關(guān)鍵描述符工作:如果任何一個(gè)文件描述符的引用計(jì)數(shù)降為零,則會(huì)觸發(fā)該對(duì)象的通知和刪除行為——即使其他描述符保持打開狀態(tài)。

3. 過(guò)濾通知

您可以根據(jù)屬性名稱、屬性值或兩者的組合過(guò)濾PPS通知。
要過(guò)濾通知,請(qǐng)使用以下語(yǔ)法:
f=attrspec{+attrspec}...
其中,attrspec是一個(gè)屬性規(guī)范,由屬性名稱或指定屬性值的表達(dá)式組成。如果你想在屬性被刪除時(shí)得到通知,在它的名字前添加一個(gè)減號(hào)(-):
f=-attr
指定屬性值的語(yǔ)法是:
attroperatorvalue
其中attr是屬性名稱,operator是用于確定觸發(fā)通知的閾值的操作符,value是要比較的值。

支持的操作包括以下方式:

  • <, <=, >, >=, =, ==,和!= ,用于整數(shù)。整數(shù)值必須在一個(gè)long long的范圍內(nèi);否則它們被當(dāng)作字符串。
  • =, ==,和!=用于字符串。注意=和==是同義的。字符串值可以包含+字符,但只能通過(guò)使用\對(duì)其轉(zhuǎn)義。

如果你只指定了一個(gè)屬性的名字,PPS會(huì)通知你任何的更新,更新來(lái)自于設(shè)置了指定名稱的屬性。如果你指定一個(gè)名稱,操作和值,PPS會(huì)通知您的任何的更新,更新來(lái)自于屬性匹配給定的名稱,操作符和值的表達(dá)式。

在full和delta模式中,如果有任何屬性規(guī)范匹配,文件描述符都會(huì)收到通知:
在full模式下,返回整個(gè)對(duì)象。
在增量模式中,只返回指定的屬性。對(duì)其他屬性的更改將被過(guò)濾掉。

在下面的例子中,被打開的對(duì)象的名稱為“objname”:
/ pps / objname?delta,f=attr1+attr2-------只返回名為“attr1”和“attr2”的屬性的更改通知
/ pps / objname?delta,f=attr1<37 --------只在屬性“attr1”的值小于37時(shí)返回更改通知
/ pps / objname?f=attr2<0+attr2>100 ---------當(dāng)屬性“attr2”有一個(gè)小于0或大于100的整數(shù)值時(shí),返回整個(gè)對(duì)象的更改通知
/ pps / objname?delta,f=attr1=a+b ---------只在屬性“attr1”的字符串值為“a+b”時(shí)返回更改通知
/ pps / objname?delta,f=attr1+attr2<10 ----------只有屬性“attr1”(對(duì)于任何更改)和屬性“attr2”的整數(shù)值小于10時(shí)才返回更改通知。

二:對(duì)象和屬性限定符

PPS支持對(duì)象及其屬性的限定符。
對(duì)象和屬性限定符包含在方括號(hào)中(" [qualifier] "),并位于包含對(duì)象或?qū)傩悦Q的行前面。支持以下限定符

n

Nonpersistence。如果將其設(shè)置在對(duì)象上,則該對(duì)象將成為非持久的。如果你把它設(shè)置在一個(gè)屬性上,如果父對(duì)象是持久的,屬性就變成非持久的;否則,限定符將被忽略。有關(guān)更多信息,請(qǐng)參見“非持久性限定符”。

i

Item。為set屬性指定一個(gè)item。

默認(rèn)情況下,不設(shè)置限定符。
在read()調(diào)用中,您將看到前面的限定符列表“[option letters]”,僅針對(duì)已設(shè)置的選項(xiàng)。
屬性選項(xiàng)總是在特殊字符和對(duì)象或?qū)傩悦Q之前。

如果限定符前沒有任何內(nèi)容,則設(shè)置該限定符。如果限定符前有一個(gè)減號(hào)(“-”),則該限定符將被清除。如果沒有指定限定符,則不會(huì)更改該限定符。例如:


image.png

可以對(duì)對(duì)象和屬性使用非持久性(n)限定符。對(duì)于在系統(tǒng)重新啟動(dòng)時(shí)可能無(wú)效且不需要保存的屬性,它非常有用。
下表描述了非持久性限定符對(duì)PPS對(duì)象和屬性的影響:


image.png

在對(duì)象上設(shè)置非持久性限定符將覆蓋在對(duì)象屬性上設(shè)置的任何非持久性限定符,因此,如果需要?jiǎng)?chuàng)建一個(gè)沒有持久化內(nèi)容的臨時(shí)對(duì)象,這很方便。

只能對(duì)屬性使用item (i)限定符。它導(dǎo)致PPS將限定符后面的值視為一組項(xiàng)。
你必須選擇一個(gè)字符,比如逗號(hào),來(lái)分隔集合中的項(xiàng)目。項(xiàng)目分隔符:
是必需的
必須是使用項(xiàng)目限定符的值中的最后一個(gè)字符
可以是項(xiàng)目中沒有使用的任何字符
一次只能添加或刪除一個(gè)設(shè)置項(xiàng)。例如,要向集合中添加項(xiàng):

[i]toolbox::hammer,
[i]toolbox::screwdriver,

從集合中刪除一個(gè)項(xiàng)目,指定一個(gè)減號(hào):

[-i]toolbox::hammer,

下面的示例顯示了不正確的條目語(yǔ)法,并且不允許使用它們:

[i]toolbox::hammer,screwdriver,
[-i]toolbox::hammer,screwdriver,

如果您多次嘗試添加一個(gè)項(xiàng),PPS會(huì)忽略重復(fù)的嘗試。例如,如果你寫以下幾行:

[i]toolbox::hammer,
[i]toolbox::hammer,
[i]toolbox::screwdriver,

訂閱者會(huì)讀到:

toolbox::hammer,screwdriver,

你可以添加空項(xiàng)目到一個(gè)集合,像這樣:

[i]toolbox::,

訂閱者會(huì)讀到:

toolbox::hammer,screwdriver,,

三:從命令行讀取和寫入

您可以使用標(biāo)準(zhǔn)的命令行實(shí)用工具查看對(duì)象的狀態(tài)或更改它們的屬性。
要讀取對(duì)象,使用cat命令。要寫入對(duì)象,使用echo。這里有一些例子。
使用cat讀
查看當(dāng)前藍(lán)牙狀態(tài)對(duì)象的內(nèi)容:
cat /pps/services/bluetooth/status
監(jiān)控mpaudio狀態(tài)對(duì)象的變化:
cat /pps/services/mm-control/mpaudio/status?wait,delta

使用echo寫
在gears控制對(duì)象中設(shè)置暫停屬性為1:
echo "pause:n:1" >> /pps/services/gears/control
將demo_enabled屬性設(shè)置為false,覆蓋mytest控件對(duì)象中所有其他現(xiàn)有屬性:
echo "demo_enabled:b:false" > /pps/mytest/control

四:訪問(wèn)控制列表配置文件

pps命令的-A選項(xiàng)指定訪問(wèn)控制列表(ACL)配置文件的路徑,該文件可用于設(shè)置訪問(wèn)權(quán)限。使用ACL配置文件可以消除在啟動(dòng)時(shí)建立PPS對(duì)象訪問(wèn)權(quán)限的讀取,因此可以用于減少啟動(dòng)時(shí)間。

如果不使用ACL配置文件,那么可能需要在啟動(dòng)時(shí)使用多個(gè)setfacl命令(請(qǐng)參閱實(shí)用程序引用)來(lái)設(shè)置PPS對(duì)象的訪問(wèn)權(quán)限。因?yàn)槊總€(gè)setfacl命令都會(huì)發(fā)送消息,所以這種設(shè)置對(duì)象訪問(wèn)權(quán)限的方法會(huì)增加消息傳遞開銷。使用一個(gè)或多個(gè)ACL配置文件可以消除這種消息傳遞開銷,并減少PPS啟動(dòng)時(shí)間。

您可以使用-A選項(xiàng)的多個(gè)實(shí)例來(lái)指定多個(gè)ACL配置文件。如果不同文件中的訪問(wèn)權(quán)限不一致,則列出的最后一個(gè)配置文件中的權(quán)限優(yōu)先。

一個(gè)PPS掛載點(diǎn)最多只能與一個(gè)配置相關(guān)聯(lián)。您應(yīng)該將ACL配置文件放在一個(gè)安全的存儲(chǔ)位置(而不是與PPS對(duì)象在同一位置)。

ACL配置文件格式旨在方便生成和解析。
一個(gè)ACL配置文件由零個(gè)或多個(gè)文本描述符組成。描述符指定PPS對(duì)象路徑的屬性。特別是,它指定訪問(wèn)權(quán)限(所有者、模式和ACL)。描述符還記錄對(duì)象的其他重要屬性,包括它是否是服務(wù)器對(duì)象;它是否持久,如果在啟動(dòng)時(shí)缺少它,是否應(yīng)該創(chuàng)建它。

描述符格式

描述符由兩個(gè)或多個(gè)非空文本行和一個(gè)空行(或文件結(jié)束)組成。兩行強(qiáng)制文本定義:
文件或目錄路徑
文件或目錄詳細(xì)信息

這兩個(gè)強(qiáng)制行后面可以跟著一個(gè)ACL,可以是短文本形式,也可以是長(zhǎng)文本形式。
ACL描述的權(quán)限(如果存在)優(yōu)先于在詳細(xì)信息行中指定的權(quán)限。ACL的形式必須能夠被acl_from_text()函數(shù)使用(即,或短或長(zhǎng)的文本形式)。根據(jù)acl_valid(), ACL還必須是完整的和有效的。具體來(lái)說(shuō),擴(kuò)展的ACL必須包含顯式的ACL_MASK條目。如果一個(gè)掩碼丟失,則不計(jì)算。

在處理前將從行中去除前導(dǎo)和后導(dǎo)空白。
注釋由“#”字符引入,并運(yùn)行到行尾;它們?cè)谡Z(yǔ)法上等同于空格。

路徑

必須指定相對(duì)于PPS掛載點(diǎn)的路徑。它們不得包含:
無(wú)關(guān)的路徑分隔器或相關(guān)組件,如“.”或“..”
前面或后面的空格
“#”字符
目錄的路徑必須以單個(gè)分隔符結(jié)束。

詳細(xì)內(nèi)容

詳細(xì)信息行不能包含多余的空格,并且必須是這樣的形式:

user:group:mode[:property[,property...]]

用戶是文件或目錄的所有者
組是文件或目錄組
模式是文件權(quán)限的位映射:用戶、組和其他(以及setuid、setgid和粘貼位)的讀、寫和執(zhí)行,存儲(chǔ)為八進(jìn)制數(shù)

屬性是可選的,由零或更多的以下內(nèi)容組成:


image.png

示例ACL配置文件

下面的示例顯示了具有短文本形式ACL的目錄和文件的ACL配置:

a/directory/
nobody:nobody:2711:O_CREAT # comment
user::rwx
group::x
other::x
mask::x                    # comment
group:nto:x

a/directory/file
nobody:nobody:640
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容