PPS允许您在打开对象时使用各种路径名选项。PPS使用这些路径名选项打开对象的文件描述符。PPS还允许您使用限定符来指定对象或属性要执行的操作(例如,使对象非持久或删除一个属性)。
一:路径名打开选项
PPS对象对用于打开它们的路径名支持扩展语法。
打开选项通常被添加为路径名的一个后缀,跟随再问号(" ? ")后面,多个选项用逗号分隔。例如:
"/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()库例程的任何人都很容易识别用于指定PPS pathname开放查询选项的语法。
支持的路径名选项包括以下内容:
backlog=num_kb
在刷新OCB(打开控制块)之前要保留的最大增量大小(以KB为单位)。如果不指定此选项,或者指定值为0,则使用默认的待定值256 KB;您可以在启动pps时指定-d选项来覆盖它。flow和backlog选项是互斥的。
如果累计增量超过num_kb,则生成清除通知,其形式为:
|@objname
cred
输出对象的凭据。只能将此选项与flow或server选项结合使用。当新客户端连接到server或flow对象时,连接通知还包含客户端凭据,形式如下:
+@objname.client_id.nnode_id.pprocess_id.uuser_id.ggroup_id.g...
critical
将发布服务器指定为该对象的关键级
crypt=domain
为该对象设置密码域。为了使用此选项,必须使用-p选项启动pps服务,该选项指定了挂载的电源安全(fs-qnx6.so)分区上的持久存储位置,该分区包含加密域。
将PPS对象分发给域意味着当它被保存在持久存储中时,它将被放入指定的加密域。例如,以下代码:
open(“/pps/test_obj?crypt=10”, O_CREAT, 0666)
当test_obj PPS对象保存在持久存储中时,将其分配给加密域10。
如果为具有不同加密域的同一个PPS对象打开多个文件描述符,则使用最后一个。在下面的例子中,使用的域是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
使用增量模式打开对象
deltadir
返回目录中所有对象(文件)的名称(仅对目录中特殊的.all对象有效)。
如果目录中的任何对象被创建或删除,这些更改将通过在其名称前加上“+”(创建)或“-”(删除)符号来表示。这种行为允许您在PPS中有效地执行readdir()并监视文件系统的更改,而不必同时监视属性的更改。
f=filter ...
根据对列出的属性的更改在通知中放置过滤器。
flow[=num_kb]
将该对象视为server对象,并带有清除和溢出(overflow)通知。num_kb指定了backlog的最大值,单位是KB。如果不指定num_kb,或者指定值为0,则使用默认的backlog大小256 KB;您可以在启动pps时指定-d选项来覆盖它。溢出overflow通知的格式为:
^@objname
flow选项和backlog选项是互斥的。您可以使用带有flow的hiwater选项来生成溢出overflow通知。
hiwater=hw_percent
指定flow的高位标记占整个Client backlog的百分比。如果积压超过这个百分比,就会生成溢出通知。当累计的增量大小超过指定积压的hw_percent时,会为每个缓冲的增量生成溢出通知。溢出通知的格式为:
^@objname
您可以指定范围从1到99%的值;如果您没有指定此选项,则使用默认的100%。您只能将hiwater选项与flow选项结合使用。
nopersist
使对象非持久。当系统重新启动时,该对象将不存在。默认设置是所有对象都是持久的,并在重启时重新加载。
notify=id:value
将打开的文件描述符与id指定的通知组相关联。当从PPS挂载点根目录的.notify文件的open()中第一次读取时返回这个id。value是要与组关联的任意字符串。
每当用notify=查询打开的文件描述符上有可用数据时,.notify文件的读取将返回字符串id:value。
opens
当打开计数发生变化时更新_open::rd,wr属性。此选项允许接收有关为写入和读取对象打开的文件描述符数量的通知。通知的格式如下:
%@objname.read_count,write_count
每当读取器或写入器的数量发生变化时,都会发送通知。这些数字在每次调用open()时增加,在调用close()时减少。O_RDONLY增加读取器的数量,O_WRONLY增加写入器的数量,O_RDWR增加读取器和写入器的数量。例如,如果您使用以下代码创建PPS对象:
fd = open(“/pps/test_obj?opens”, O_CREAT|O_RDWR, 0666);
然后从这个文件描述符读取后,接收到以下通知:
%@test_obj.1,1
如果您使用O_WRONLY打开相同的PPS对象,那么将生成以下通知:
%@test_obj.1,2
reflect
将此对象上所做的属性更改反射回该对象。
server
将publisher指定为对象的“server”。
verbose[=level]
设置此对象的详细级别。如果指定此选项时不带参数,则级别为9(最高)。
wait
打开文件并清除O_NONBLOCK标志,以便read()调用一直等待,直到对象更改或出现增量。
2. 关键选项
可以使用关键选项作为在publisher异常终止时清理属性的机制。
如果在打开文件描述符进行写操作时使用此选项,那么当文件描述符关闭时,PPS将删除所有非持久性属性,并在发送给所有订阅者的通知字符串中在对象名称前加上星号(" * ")。PPS不提供已删除属性的列表
对于任何一个PPS对象,都不应该有一个以上的关键文件描述符。
文件描述符可以显式复制(通过dup()、dup2()、fcntl()等),也可以隐式复制(通过fork()、spawn()等)。重复的描述符实际上增加了基础关键描述符上的引用计数。关键对象所需的行为(volatile属性的通知和删除)直到文件描述符的引用计数下降到零时才会被触发,表明原始的和所有重复文件描述符都已被关闭。
但是,如果在关键模式下多次打开PPS对象,则每个文件描述符都作为关键描述符工作:如果任何一个文件描述符的引用计数降为零,则会触发该对象的通知和删除行为——即使其他描述符保持打开状态。
3. 过滤通知
您可以根据属性名称、属性值或两者的组合过滤PPS通知。
要过滤通知,请使用以下语法:
f=attrspec{+attrspec}...
其中,attrspec是一个属性规范,由属性名称或指定属性值的表达式组成。如果你想在属性被删除时得到通知,在它的名字前添加一个减号(-):
f=-attr
指定属性值的语法是:
attroperatorvalue
其中attr是属性名称,operator是用于确定触发通知的阈值的操作符,value是要比较的值。
支持的操作包括以下方式:
- <, <=, >, >=, =, ==,和!= ,用于整数。整数值必须在一个long long的范围内;否则它们被当作字符串。
- =, ==,和!=用于字符串。注意=和==是同义的。字符串值可以包含+字符,但只能通过使用\对其转义。
如果你只指定了一个属性的名字,PPS会通知你任何的更新,更新来自于设置了指定名称的属性。如果你指定一个名称,操作和值,PPS会通知您的任何的更新,更新来自于属性匹配给定的名称,操作符和值的表达式。
在full和delta模式中,如果有任何属性规范匹配,文件描述符都会收到通知:
在full模式下,返回整个对象。
在增量模式中,只返回指定的属性。对其他属性的更改将被过滤掉。
在下面的例子中,被打开的对象的名称为“objname”:
/ pps / objname?delta,f=attr1+attr2-------只返回名为“attr1”和“attr2”的属性的更改通知
/ pps / objname?delta,f=attr1<37 --------只在属性“attr1”的值小于37时返回更改通知
/ pps / objname?f=attr2<0+attr2>100 ---------当属性“attr2”有一个小于0或大于100的整数值时,返回整个对象的更改通知
/ pps / objname?delta,f=attr1=a+b ---------只在属性“attr1”的字符串值为“a+b”时返回更改通知
/ pps / objname?delta,f=attr1+attr2<10 ----------只有属性“attr1”(对于任何更改)和属性“attr2”的整数值小于10时才返回更改通知。
二:对象和属性限定符
PPS支持对象及其属性的限定符。
对象和属性限定符包含在方括号中(" [qualifier] "),并位于包含对象或属性名称的行前面。支持以下限定符
n
Nonpersistence。如果将其设置在对象上,则该对象将成为非持久的。如果你把它设置在一个属性上,如果父对象是持久的,属性就变成非持久的;否则,限定符将被忽略。有关更多信息,请参见“非持久性限定符”。
i
Item。为set属性指定一个item。
默认情况下,不设置限定符。
在read()调用中,您将看到前面的限定符列表“[option letters]”,仅针对已设置的选项。
属性选项总是在特殊字符和对象或属性名称之前。
如果限定符前没有任何内容,则设置该限定符。如果限定符前有一个减号(“-”),则该限定符将被清除。如果没有指定限定符,则不会更改该限定符。例如:
image.png
可以对对象和属性使用非持久性(n)限定符。对于在系统重新启动时可能无效且不需要保存的属性,它非常有用。
下表描述了非持久性限定符对PPS对象和属性的影响:
image.png
在对象上设置非持久性限定符将覆盖在对象属性上设置的任何非持久性限定符,因此,如果需要创建一个没有持久化内容的临时对象,这很方便。
只能对属性使用item (i)限定符。它导致PPS将限定符后面的值视为一组项。
你必须选择一个字符,比如逗号,来分隔集合中的项目。项目分隔符:
是必需的
必须是使用项目限定符的值中的最后一个字符
可以是项目中没有使用的任何字符
一次只能添加或删除一个设置项。例如,要向集合中添加项:
[i]toolbox::hammer,
[i]toolbox::screwdriver,
从集合中删除一个项目,指定一个减号:
[-i]toolbox::hammer,
下面的示例显示了不正确的条目语法,并且不允许使用它们:
[i]toolbox::hammer,screwdriver,
[-i]toolbox::hammer,screwdriver,
如果您多次尝试添加一个项,PPS会忽略重复的尝试。例如,如果你写以下几行:
[i]toolbox::hammer,
[i]toolbox::hammer,
[i]toolbox::screwdriver,
订阅者会读到:
toolbox::hammer,screwdriver,
你可以添加空项目到一个集合,像这样:
[i]toolbox::,
订阅者会读到:
toolbox::hammer,screwdriver,,
三:从命令行读取和写入
您可以使用标准的命令行实用工具查看对象的状态或更改它们的属性。
要读取对象,使用cat命令。要写入对象,使用echo。这里有一些例子。
使用cat读
查看当前蓝牙状态对象的内容:
cat /pps/services/bluetooth/status
监控mpaudio状态对象的变化:
cat /pps/services/mm-control/mpaudio/status?wait,delta
使用echo写
在gears控制对象中设置暂停属性为1:
echo "pause:n:1" >> /pps/services/gears/control
将demo_enabled属性设置为false,覆盖mytest控件对象中所有其他现有属性:
echo "demo_enabled:b:false" > /pps/mytest/control
四:访问控制列表配置文件
pps命令的-A选项指定访问控制列表(ACL)配置文件的路径,该文件可用于设置访问权限。使用ACL配置文件可以消除在启动时建立PPS对象访问权限的读取,因此可以用于减少启动时间。
如果不使用ACL配置文件,那么可能需要在启动时使用多个setfacl命令(请参阅实用程序引用)来设置PPS对象的访问权限。因为每个setfacl命令都会发送消息,所以这种设置对象访问权限的方法会增加消息传递开销。使用一个或多个ACL配置文件可以消除这种消息传递开销,并减少PPS启动时间。
您可以使用-A选项的多个实例来指定多个ACL配置文件。如果不同文件中的访问权限不一致,则列出的最后一个配置文件中的权限优先。
一个PPS挂载点最多只能与一个配置相关联。您应该将ACL配置文件放在一个安全的存储位置(而不是与PPS对象在同一位置)。
ACL配置文件格式旨在方便生成和解析。
一个ACL配置文件由零个或多个文本描述符组成。描述符指定PPS对象路径的属性。特别是,它指定访问权限(所有者、模式和ACL)。描述符还记录对象的其他重要属性,包括它是否是服务器对象;它是否持久,如果在启动时缺少它,是否应该创建它。
描述符格式
描述符由两个或多个非空文本行和一个空行(或文件结束)组成。两行强制文本定义:
文件或目录路径
文件或目录详细信息
这两个强制行后面可以跟着一个ACL,可以是短文本形式,也可以是长文本形式。
ACL描述的权限(如果存在)优先于在详细信息行中指定的权限。ACL的形式必须能够被acl_from_text()函数使用(即,或短或长的文本形式)。根据acl_valid(), ACL还必须是完整的和有效的。具体来说,扩展的ACL必须包含显式的ACL_MASK条目。如果一个掩码丢失,则不计算。
在处理前将从行中去除前导和后导空白。
注释由“#”字符引入,并运行到行尾;它们在语法上等同于空格。
路径
必须指定相对于PPS挂载点的路径。它们不得包含:
无关的路径分隔器或相关组件,如“.”或“..”
前面或后面的空格
“#”字符
目录的路径必须以单个分隔符结束。
详细内容
详细信息行不能包含多余的空格,并且必须是这样的形式:
user:group:mode[:property[,property...]]
用户是文件或目录的所有者
组是文件或目录组
模式是文件权限的位映射:用户、组和其他(以及setuid、setgid和粘贴位)的读、写和执行,存储为八进制数
属性是可选的,由零或更多的以下内容组成:
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
网友评论