如何解决linux重启通知列表如何工作?
我正在使用 busybox rootfs 在 QEMU ARM64 上运行的 Linux 内核 5.8 上测试重启通知程序挂钩。这是我第一次使用通知列表,所以我可能是错的。我添加了一个执行良好的重启通知程序,但我还使用 .next
向列表中添加了第二项,并且此通知程序的处理程序不执行。这是我的虚拟司机的片段:
static int reboot_handler_first(struct notifier_block *this,unsigned long action,void *data)
{
printk(KERN_INFO "first reboot notifier called\n");
return 0;
}
static int reboot_handler_second(struct notifier_block *this,void *data)
{
printk(KERN_INFO "second reboot notifier called\n");
return 0;
}
static struct notifier_block reboot_notifier_second = {
.notifier_call = reboot_handler_second,.next = NULL,.priority = INT_MAX,};
static struct notifier_block reboot_notifier_first = {
.notifier_call = reboot_handler_first,.next = &reboot_notifier_second,};
在这里,reboot_handler_first()
被调用,但我没有看到来自 reboot_handler_second()
的任何日志。我原以为 reboot_notifer_first()
会触发 reboot_notifier_second()
但似乎并非如此。我错过了什么吗?
以下是我在这个内核和 busybox rootfs 中看到的日志:
/ # reboot
/ # umount: devtmpfs busy - remounted read-only
swapoff: can't open '/etc/fstab': No such file or directory
The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes
Requesting system reboot
[ 20.158023] first reboot notifier called
[ 20.232718] reboot: Restarting system
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070]
编辑
这就是我的 module_init(hello_init)
函数的样子。我只注册了第一个重启通知程序 reboot_notifier_first
,然后将其 next 设置为指向 reboot_notifier_second
。请纠正我。我的理解是我需要用 register_reboot_notifier()
注册第一个通知程序,然后我只需要设置当前 .next
的 notifier_block
以将新节点添加到链表。这样我就会得到一个通知块链。
static int __init hello_init(void)
{
int rc;
rc = register_reboot_notifier(&reboot_notifier_first);
printk(KERN_INFO "This is from init\n");
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。