0

我编写了一个简单的代码来捕获netdevice通知并将它们的值打印到消息日志文件中......这是代码:

#include <linux/notifier.h>
#include <asm/kdebug.h> 
#include <linux/netdevice.h>
#include <linux/inetdevice.h>

int my_dev_event_handler (struct notifier_block *self,unsigned long val, void *data)
{
    printk (KERN_INFO "my_dev_event: Val=%ld, Interface=%s\n", val,((struct net_device *) data)->name);
    return 0;
}

static struct notifier_block my_dev_notifier = {
.notifier_call = my_dev_event_handler,
};

static int __init
my_init (void)
{
printk(KERN_ALERT "***Module Loaded***\n");
register_netdevice_notifier (&my_dev_notifier); 

   return 0;
}

static void __exit my_end(void)
{
    printk(KERN_ALERT "***Module Unloaded***\n");
}

module_init(my_init);
module_exit(my_end);

此代码编译并正确运行,每次设备启动/关闭时都会打印出“my_dev_event:...”行...但有时(并非总是)整个系统会在设备启动\关闭时冻结...现在我有两个问题:1-为什么系统冻结?这段代码有什么问题吗?2-如果有更好的方法在设备连接/断开连接时通知我的内核模块......

4

1 回答 1

2

我看到的唯一问题是my_end没有取消注册通知程序。
卸载模块后,这可能会导致崩溃或死机。这是因为指向您的代码的指针保留在 Linux 数据结构中,但您的代码不再存在。

关于另一种方式 - 我认为您正在使用正确的方式来获取这些通知。

于 2012-06-18T12:52:24.153 回答