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内核事件通知链学习

Linux内核基础--事件通知链(notifier chain)转

linux内核数据结构之等待队列

linux内核数据结构之等待队列

Linux 内核 内存管理RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )