第四章 通知鏈

通知鏈是一份函數列表,當給定事件發生時予以執行。列表中的每一個函數都讓另外一個子系統知道,調用此函數的子系統內所發生的一個事件或子系統所偵測到個一個事件。網絡

通知鏈使用發佈-訂閱(publish-and-subcribe)模型:函數

  • 被通知者 ——接收某事件的子系統,提供回調函數予以調用
  • 通知者 ——感覺到一個事件並調用回呼函數的子系統 通知

通知鏈列表元素的類型是notifier_block,定義:spa

/*
 * notifier_call 要執行的函數
 * next 連接列表的元素
 * priority 優先級
 */
struct notifier_block{
    int (*notifier_call)(struct notifier_block *self, unsigned long, void *);
    struct notifier_block *next;
    int priority;
}

網絡子系統通知鏈:code

  • inetaddr_chain ——發送有關本地接口上的IPv4地址的插入、刪除以及變動的通知信息
  • inet6addr_chain —— 發送有關本地接口上的IPv6地址的插入、刪除以及變動的通知信息
  • netdev_chain —— 發送有關網絡設備註冊狀態的通知信息
/*struct nofitier_block **list 爲通知鏈*/
/*註冊*/
int notifier_chain_register(struct nofitier_block **list, struct notifier_block *n);
/*除名*/
int notifier_chain_unregister(struct nofitier_block **list, struct notifier_block *n);

 回調函數:接口

  註冊 除名
inetaddr_chain register_inetaddr_notifier unregister_inetaddr_notifier
inet6addr_chain register_inet6addr_notifier unregister_inet6addr_notifier
netdev_chain register_netdevice_notifier unregister_netdevice_notifier

通知:事件

/*
 * n 通知鏈
 * val事件類型
 * v 輸入參數
 * 返回值: NOTIFY_OK-通知信息被正確處理
           NOTIFY_DONE - 對通知信息不敢興趣
           NOTIFY_BAD - 有些事情出錯,中止調用此事件的回調函數
           NOTIFY_STOP - 函數被正確調用,此事件不須要進一步調用其餘回調函數
           NOTIFY_STOP_MASK - 由notifier_call_chain檢查,以瞭解是否中止調用回調函數,或者繼續調用下去
 */
int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)
{
    int ret = NOTIFY_DONE;
    struct notifier_block *nb = *n;
    while(nb)
    {
        ret = nb->notifier_call(list,val,v);
        if(ret&NOTIFY_STOP_MASK) 
        {
            return ret;
        }
        nb = nb->next;
    }
    return ret;
}
相關文章
相關標籤/搜索