内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些事件,其他多个子系统都很感兴趣,此时就需要用到notification chain.
举个具体的例子,比如说一台主机由于某个网卡的损坏或其他原因不能使用,从而导致连接此网卡的网络不能使用,这个时侯就是notification chain.来通知路由表去除这个网络的路由表项。
notification chain就是一个链表,包括了所有当某个事件发生时当前子系统所需要执行的函数,而这些函数是被其他的子系统注册到nc(下面notification chain就简称nc了)里。
下面来看源码.
首先来看nc的数据结构(include/linux/notifier.h):
notifier_call也就是将会执行的回调函数,next指向下一个nc节点,priority是优先级,优先级高的节点会先执行。
struct notifier_block {
int (*notifier_call)(struct notifier_block *, unsigned long, void *);
struct notifier_block *next;
int priority;
};
注册到一个nc上:
这里我们使用notifier_chain_register来实现注册。
这里遍历nc然后按照优先级来插入相应的位置(也就是插入到优先级比自己小的之前)
static int notifier_chain_register(struct notifier_block **nl,
struct notifier_block *n)
{
///开始遍历
while ((*nl) != NULL) {
///比较优先级
if (n->priority > (*nl)->priority)
break;
nl = &((*nl)->next);
}
///链表插入的操作
n->next = *nl;
rcu_assign_pointer(*nl, n);
return 0;
}
在nc上唤醒一个事件,也就是执行相对应的函数:
notifier_call_chain方法.
第一个参数为nc,第二个参数为事件类型,第三个参数为传给回调函数的参数,第三个和第四个参数分别为nc已经遍历的数目。
事件类型值可以看notifier.h中定义的。
流程很简单就是遍历此nc,然后调用相应的回调函数。
static int __kprobes notifier_call_chain(struct notifier_block **nl,
unsigned long val, void *v,
int nr_to_call, int *nr_calls)
{
int ret = NOTIFY_DONE;
struct notifier_block *nb, *next_nb;
nb = rcu_dereference(*nl);
while (nb && nr_to_call) {
next_nb = rcu_dereference(nb->next);
///基本上所有的回调函数里面都会使用switch语句,通过判断不同的event值来执行不同的操作。
ret = nb->notifier_call(nb, val, v);
if (nr_calls)
(*nr_calls)++;
if ((ret & NOTIFY_STOP_MASK) == NOTIFY_STOP_MASK)
break;
nb = next_nb;
nr_to_call--;
}
///返回值为最后一个回调函数执行的返回值
return ret;
}
这里还要注意下,一般上来说内核都会对上面的注册和执行函数进行包装。
内核中至少有10种不同的nc,比如inetaddr_chain就是本地网络地址的改变等等事件所触发。
分享到:
相关推荐
在Android系统中,Notification是应用与用户交互的重要方式之一,特别是在后台运行时,它能向用户提供关键信息。常驻Notification是指即使用户关闭了应用程序,Notification仍然保留在通知栏,持续提醒用户有未处理...
在Android开发中,`Notification`是用户界面的一个关键组件,用于在状态栏向用户显示重要的信息或提醒。在"疯狂Android中有关Notification的简单例子"这个主题中,我们将深入探讨`Notification`的基本概念、创建过程...
在Android开发中,Notification是一种非常重要的组件,它用于在状态栏中向用户显示消息和提醒。当应用在后台运行或用户不在与应用交互时,Notification是保持与用户沟通的关键途径。"Notification中更新进度条"这个...
在Android开发中,Notification是一个非常重要的组件,它用于在状态栏显示消息,即使用户不在应用程序中,也能提醒用户有新的事件或信息。本实例详细探讨了如何应用Notification,包括其创建、属性设置、触发动作...
在Android开发中,Notification是应用与用户交互的重要方式,它能够在状态栏显示消息,即使用户不在应用程序中也能接收到信息。本教程将深入探讨Notification的最新用法,如何实现通知栏常驻,以及如何利用big View...
使用javascript 封装实现 Notification 消息通知框
在Android开发中,Notification是应用与用户交互的重要方式,它能够在状态栏中向用户展示信息,即使用户不在应用中也能接收到消息提醒。本示例着重讲解了如何创建和使用不同类型的Notification,包括普通...
在Android开发中,Notification是应用与用户交互的重要方式,它能够在状态栏中显示信息,即使用户不在应用程序中也能提醒用户有新的活动或消息。本文将深入解析Android Notification的工作原理、设计模式以及如何...
在Android系统中,Notification是一种非常重要的机制,它允许应用程序在状态栏显示提醒,即使用户不在应用界面也能感知到应用的状态或新消息。本项目是一个基于Android 2.3(Gingerbread)版本的小实例,旨在帮助...
在Android开发中,Notification是一种非常重要的机制,它用于在用户不直接与应用交互时向他们传达信息。当应用需要在后台告知用户某些事件的发生,如收到新消息、更新或者完成任务,Notification会在状态栏上显示...
在Android开发中,`Notification`是用户界面的一个关键组件,用于在状态栏中显示消息,即使应用程序在后台运行,也能提醒用户有新的活动或事件发生。`Notification`的设计旨在提供一致且非侵入性的用户体验,使得...
在Android开发中,`Notification`、`Service`和`BroadcastReceiver`是三个核心组件,它们在许多场景下都有着重要的作用,特别是在实现应用后台运行、实时更新等任务时。本项目"Android notification+Service实时更新...
在Ext JS中,“Notification”插件是用于显示通知消息的一个组件,它可以帮助开发者在用户界面上创建吸引人且易于理解的提示信息。本文将深入探讨Ext JS Notification插件的使用方法、功能特性以及如何集成到项目中...
在Android系统中,Notification是应用与用户交互的重要方式,它可以在状态栏中显示消息,即使应用在后台运行也能吸引用户的注意力。"Android中notification通知的Demo——震动,铃声,Led灯闪烁"这个主题主要涉及...
在Android开发中,Notification是应用与用户交互的重要方式之一,特别是在后台运行时,它能向用户提供关键信息,而不会打扰到他们的主要活动。"Notification Demo"是一个示例项目,专门展示了如何在Android应用中...
在iOS开发中,Notification是一种非常重要的通信机制,它允许应用程序的不同组件之间相互通信,而无需直接耦合。本文将详细讲解iOS中的Notification机制,以及如何在iOS 5中使用Notification进行参数传递。 首先,...
在Android开发中,`Notification`是系统提供的一种机制,它能够在状态栏或者顶部通知栏显示信息,即使应用在后台运行或者被用户关闭,仍然能够向用户传达关键信息。本示例"Notification顶部通知栏demo"显然是为了...