Linux内核事件通知链学习
1.Linux内核子系统
https://blog.csdn.net/qq_36016407/article/details/73558361
系统调用子系统、进程管理、虚拟文件子系统、内存管理、网络管理。
Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施。为满足这样的需求,内核实现了事件通知链机制(notificationchain)。
通知链只能用在各个子系统之间,而不能在内核和用户空间进行事件的通知。
内核更详细的版本:
https://blog.csdn.net/hguisu/article/details/6122513#t7
可以看到网络服务,也就是套接字是和TCP/IP驱动程序联系在一起的,前者会使用后者。
2.介绍
转自:https://blog.csdn.net/wh8_2011/article/details/50541212
https://blog.csdn.net/frank_jb/article/details/93191300
例如上图中的事件通知链,针对网络子系统,对应三个事件的通知链,有表示ipv4地址发生变化时的inetaddr_chain,表示ipv6地址发生变化的inet6addr_chain;还有表示设备注册、状态变化的netdev_chain。当有这些事件发生时,会在链表中找到一个优先级高的,执行对应的回调函数。
2.1 通知链的核心结构:
struct notifier_block { int(*notifier_call)(struct notifier_block *, unsigned long, void*); structnotifier_block *next; intpriority; };
2.2 运作机制
1、通知者定义通知链。
2、被通知者向通知链中注册回调函数。调用的是notifier_chain_register。
3、当事件发生时,通知者发出通知(执行通知链中所有元素的回调函数)。调用的是notifier_call_chain。
通知者是检测事件发生的,若发生,则通知所有对该事件感兴趣的一方 事件发生。