在本章节中,我们将学习如何使用Linux内核的Notifier Chain机制来注册一个重启notifier。当系统重启时,这个notifier会打印一条消息。Notifier Chain是内核中一种重要的观察者模式实现,用于在特定事件发生时通知注册的回调函数。
Notifier Chain是Linux内核中用于实现发布-订阅模式的一种机制。它允许内核模块在特定事件发生时注册回调函数,从而得到通知。常见的事件包括系统重启、CPU热插拔、内存不足等。
| 组件 | 描述 |
|---|---|
| Notifier Chain | 管理回调函数链表的内核结构 |
| Notifier Block | 包含回调函数和优先级的结构体 |
| 事件类型 | 如 SYS_RESTART, SYS_HALT 等 |
以下是一个简单的内核模块示例,它注册一个重启notifier,在系统重启时打印消息。
#include <linux/notifier.h>
#include <linux/module.h>
#include <linux/reboot.h>
static int reboot_notifier(struct notifier_block *nb, unsigned long action, void *data)
{
switch (action) {
case SYS_RESTART:
pr_info("系统即将重启!\\n");
break;
case SYS_HALT:
pr_info("系统即将停机!\\n");
break;
case SYS_POWER_OFF:
pr_info("系统即将关机!\\n");
break;
default:
break;
}
return NOTIFY_DONE;
}
static struct notifier_block reboot_nb = {
.notifier_call = reboot_notifier,
.priority = 0,
};
static int __init my_notifier_init(void)
{
int ret;
ret = register_reboot_notifier(&reboot_nb);
if (ret) {
pr_err("无法注册重启notifier\\n");
return ret;
}
pr_info("重启notifier注册成功\\n");
return 0;
}
static void __exit my_notifier_exit(void)
{
unregister_reboot_notifier(&reboot_nb);
pr_info("重启notifier已注销\\n");
}
module_init(my_notifier_init);
module_exit(my_notifier_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("一个简单的重启notifier示例");
注意:在实际使用中,需要确保模块的编译和加载正确,并且有足够的权限。
要测试这个模块,可以按照以下步骤进行:
dmesg命令查看模块加载消息。sudo reboot),观察系统日志中的输出。