没有合适的资源?快使用搜索试试~ 我知道了~
Linux Notification chains--1
需积分: 9 1 下载量 5 浏览量
2011-09-11
12:38:27
上传
评论
收藏 80KB DOC 举报
温馨提示
试读
15页
Linux Notification chains--1
资源推荐
资源详情
资源评论
Linux Notication chains
是 中提供一种在内核子系统 中共享事件信息的方法。
基于版本 , 有四种
!
"#
!
$%
&'#'#
#!(!!
)*%+
(,#'
---#./!,'
#---#./!---#./
!,0,!#-#./
---#./'#---#./'!
---#./--!,
*%+(,,#&
*%+.*%!1+!/!, 1,
,&-(- (!
---./!
'---#./(*%+
!! !(,
- !(!'*%+#
!234
转:
浅析
前 言
本人正在学习《+!!# 5》一书,读到
一章,感觉该机制挺有意思,就对该方面的资料进行了学习并简单整理,算是对
前一段学习的小结。文中所用到的资料在参考文献中注明。本文中许多描述以及用词会与
参考资料的描述有较大重合。本人无意侵犯各参考资料的著作者,仅仅是为了知识共享以
及交流。若哪位作者感觉本人对您有所冒犯,请通知本人,本人立即改正。
谢谢!
概 述
内核许多子系统之间关联紧密,因此在一个子系统发生或者检测到的事件信息很可能对其
他子系统来说也是有价值的。为了满足其他子系统对这些事件信息的需求,即在某个子系
统内发生或检测到事件时,其他对此感兴趣的子系统也能知道事件的发生,内核提供了
机制。
注意: 适用于内核子系统之间的信息传递,不涉及用户态。
使用发布1订阅模型(1!1!):在事件发
生时,检测或产生事件的子系统作为主动一方通过通知函数来告知作为被动一方的订阅者
(对此事件感兴趣的子系统)。这里有个额外要求,订阅一方要提供 函数以供发
布方调用,当然,提供什么样的 函数完全由订阅方决定。
订阅者必须知道其他子系统提供了哪些事件通知支持,以选择可以订阅的事件通知;当然,
订阅者本身也是一个子系统,因此也具有信息发布功能,因此它也要清楚本系统内哪些事
件对其他子系统是有价值的,即有哪些本系统内的事件发生时需要通知订阅者,但是子系
统对谁订阅了事件通知以及为什么要订阅一无所知。
从某种意义上来说, 实现了事件信息的共享
- 结构
由 组成,其结构类型如下
(!):
-
6
.7-/.-7,'#!#'(!7/8
-78
8
98
- 回调函数:, 参数通常为 - 本身;#!# 型参数表
示发生的事件类型,因为一个 可能支持多个事件,此参数用来对事件进行区分,在
! 文件 中预订了一些事件常量,例如与 !( 相关的就有多
个事件;(!7用来存放私有信息,其具体信息取决于特定的事件
指针:用于同一个 中的 - 的链接
:表示 - 函数的优先级,在事件发生时先调用高优先级的回调函数。
实际上在 中 是根据优先级来进行排队的,高优先级的在前面,这样
就可以容易地实现根据优先级来调用回调函数。同优先级的根据加入 的顺序来排队,
最新加入的排在同优先级的最后。通常该字段取缺省值 :,这样回调函数就根据加入
的顺序来调用。该字段的用法可参考函数 --# 的实现。
实际上 就是一组函数列表。通常 的名字的格式为
-、--、 --,例如 --。
回调函数 -
.7-/.-7,'#!#'(!7/8
前面已经讲过函数参数的含义,注意到该函数的返回值为 类型,这里就来看一下可能
的返回值(! 文件中定义了这些常值):
;&5<=-0;>:::::对该事件不感兴趣(根据 #!# 参数)
;&5<=-;?::::成功响应该事件
;&5<=-*&;@-A*?:B:::该回调函数返回后停止处理后续
;&5<=-"0.;&5<=-*&;@-A*?C::::/
出错,回调函数返回后停止处理后续
;&5<=-*&;@.;&5<=-;?C;&5<=-*&;@-A*?/
成功响应事件,回调函数返回后停止处理后续
注意,;&5<=-*&;@ 和 ;&5<=-"0 的定义都包含了 ;&5<=-*&;@-A*?。
并发访问控制
在 文件中定义了对 进行并发访问控制的读写锁
-。系统中对所有 的并发访问都是由该锁来控制。子系统
通常只在 或者加载 ! 时注册 ,即修改 ,而
大多数时间仅以只读方式来访问,因此一个锁基本不会影响系统性能。
$基 本 例 程
下面的基本例程位于 文件中
要接收某些事件的通知需要先注册到支持这些事件的 中:
--#.-77'-7/
为
为当前子系统提供的 -,其中指明了回调函数
该函数会根据 - 的优先级 将 插入到 中合适位置
如果不想接受已订阅事件的通知,则需要取消订阅注册:
--#.-77'-7/
为
为当前子系统提供的 -
当事件发生时,要通知订阅该事件的子系统:
--.-77'#!#('(!7(/
为
( 为事件类型,前面提到过一个 可能支持多个事件,该参数用来对事件进行区分
( 存放特定于事件的信息
该函数会遍历 ,对 中每个 ,以参数 ( 和 ( 调用其
- 函数,若 - 函数返回值中标志了 ;&5<=-*&;@-A*?(如
;&5<=-"0、;&5<=-*&;@),则函数停止处理,返回当前 的返回值;
否则返回 中最后一个 的返回值。
注意:多数子系统都定义了这些基本例程的封装函数,因此很少看到对这些函数的直接调
用。例如后面的例子中用到的 #-- 和 #--
就是简单的封装函数。
剩余14页未读,继续阅读
资源评论
zhenwenxian
- 粉丝: 797
- 资源: 773
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功