Linuxnotifier技术
内核通知链介绍(引用网络资料):
在linux内核系统中,各个模块、子系统之间是相互独立的。Linux内核可以通过通知链机制来获取由其它模块或子系统产生的它感兴趣的某些事件。例如,可以通过通知链来获取某总线上的设备增加、删除情况,来动态添加和卸载dev文件设备。
Linux内核中包含四种类型通知链:
Atomic notifierchains: 这种类型通知链回调函数在中断上下文中运行,不能被阻塞;
Blockingnotifier chains: 回调函数运行在进程上下文中,可以阻塞;
Raw notifierchains: 通知链回调函数在运行位置上没有限制,所有锁和保护都由调用都实现;
SRCU notifierchains:阻塞型通知链变种,回调函数运行在进行上下文;
通知链可以由structnotifier_block结构来描述
Struct notifier_block{
Int (*nitifier_call)(structnotifier_block *, unsigned long, void *); // 回调函数
Struct notifier_block __rcu *next;
Int priority;
}
以blocking notifierchain为例说明通知链使用:
1.) 定义通知链表头;
Struct blocking_notifier_head bus_notifier;
2.)初始化链表头
BLOCKING_INIT_NOTIFIER_HEAD(&bus_notifier);
3.)定义一个notifier,并增加notifier到通知链
Inti2cdev_notifier_call(struct notifier_block *nb, unsigned long action, void*data)
{
Strcutdevice *dev = data;
Switch(action) {
case BUS_NOTIFY_ADD_DEVICE:
……..
case BUS_NOTIFY_DEL_DEVICE:
…..
}
Return 0;
}
Structnotifier_block i2cdev_notifier = {
.notifier_call =i2cdev_notifier_call,
};
Blocking_notifier_chain_register(&bus_notifier,&i2cdev_notifier);
4.)当所监控的模块或子系统发生对应事件时,调用notifier_call函数通知监控者
Blocking_notifier_call_chain(&bus_notifier,BUS_NOTIFY_ADD_DEVICE, dev);
I2cdev_notifier_call函数被调用: