Linux通知链机制
Posted 四季帆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux通知链机制相关的知识,希望对你有一定的参考价值。
1. 概念
通知链只能在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。
通知链是一个函数链表,链表上的每一个节点都注册了一个函数。当某个事件发生时,链表上所有节点对应的函数就会被执行。和系统调用signal的思想差不多。
2. 通知链的运作机制
2.1 被通知者:对某一事件感兴趣的一方。定义了当事件发生时,相应的处理函数,将其注册到通知链中,即回调函数。
2.2 通知者:事件的通知者。当检测到某事件或自身产生事件时,执行通知链上所有的事件(遍历并执行通知链表上的所有回调函数)。
3. 举例
3.1 模块A
3.1.1 使用各种变种去定义自己的通知链(比如zhangsan_handler_list)
static ATOMIC_NOTIFIER_HEAD(sijifan_handler_list);
3.1.2 封装一个接口提供给其它模块注册通知事件
int register_sijifan_handler(struct notifier_block *nb)
{
return atomic_notifier_chain_register(sijifan_handler_list, nb);
}
3.1.3 执行通知链上的事件
void do_notifier()
{ //在atomic_notifier_call_chain函数中遍历并执行sijifan_handler_list链表上的所有事件
atomic_notifier_call_chain(sijifan_handler_list,1,NULL);
}
3.2 其它模块(除模块A以外的模块)
3.2.1 定义自己的通知事件
struct notifier_block eat;
int eat_bread(){······}
eat.notifier = eat_bread;
eat.xxx = xxx;
3.2.2 注册eat事件到zhangsan_handler_list通知链
register_sijifan_handler(&eat); //使用模块A提供的注册接口
以上是关于Linux通知链机制的主要内容,如果未能解决你的问题,请参考以下文章
linux kernel notifier chain(事件通知链)
Linux内核基础--事件通知链(notifier chain)转
Linux 内核 内存管理RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )