写一段使用非阻塞的内核通知链的代码,含异常注销代码
时间: 2023-12-01 14:53:17 浏览: 62
好的,下面是一段使用非阻塞的内核通知链的代码,并含有异常注销代码:
```c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/notifier.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("CSDN");
MODULE_DESCRIPTION("Non-blocking kernel notification chain example");
static ATOMIC_NOTIFIER_HEAD(notifier_chain);
struct my_notifier {
struct notifier_block nb;
int value;
};
static int my_notifier_event(struct notifier_block *nb, unsigned long event, void *data) {
struct my_notifier *notifier = container_of(nb, struct my_notifier, nb);
int value = notifier->value;
if (event == MY_EVENT) {
pr_info("Value is now: %d\n", value);
}
return NOTIFY_OK;
}
static int __init notifier_chain_init(void) {
int i;
struct my_notifier *notifier;
for (i = 0; i < 5; i++) {
notifier = kmalloc(sizeof(*notifier), GFP_KERNEL);
if (!notifier) {
pr_err("Failed to allocate memory\n");
goto err_out;
}
notifier->value = i;
notifier->nb.notifier_call = my_notifier_event;
atomic_notifier_chain_register(¬ifier_chain, ¬ifier->nb);
}
return 0;
err_out:
while (i--) {
notifier = container_of(notifier_chain.notifiers.next, struct my_notifier, nb);
atomic_notifier_chain_unregister(¬ifier_chain, ¬ifier->nb);
kfree(notifier);
}
return -ENOMEM;
}
static void __exit notifier_chain_exit(void) {
struct my_notifier *notifier;
atomic_notifier_chain_unregister(¬ifier_chain, ¬ifier->nb);
kfree(notifier);
}
module_init(notifier_chain_init);
module_exit(notifier_chain_exit);
```
注:代码中 `MY_EVENT` 是应该按实际情况自行定义的事件值。
阅读全文