2012-06-18 50 views
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-如果有更好的方式來通知我的內核模塊時,設備連接/斷開...

回答

2

我看到的唯一問題是,my_end不註銷通知程序。
卸載模塊後,可能會導致崩潰或死機。這是因爲指向您的代碼的指針保留在Linux數據結構中,但您的代碼不再存在。

關於另一種方式 - 我認爲你正在使用正確的方式來獲取這些通知。