最近修改ct_sync代码,发现ct_sync使用了Linux Notifier, 这是很不错的一种异步通讯机制。
1。数据结构
struct notifier_block
{
int (*notifier_call)(struct notifier_block *self, unsigned long, void *); /*回调处理函数*/
struct notifier_block *next;
int priority;
/*用于对注册者进行优先级排队,高优先级的处理例程将被优先执行,由注册者 自己指定 */
};
2。基本例程
1) 先注册到某个notifier_block链;
extern int notifier_chain_register(struct notifier_block **list, struct notifier_block *n);
说明:这时的n可以只要初始化(*notifier_call)指针;
2)当事件发生时,调用notifier_call_chain()来触发相应的处理函数。
extern int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v);
说明:轮循执行某个notifier_block链中的所有notifier_block,对其(*notifier_call)传入参数val和*v;
其中val应该是EVENT NUMBER,而*v是导致这个事件的数据结构,比如某个网络设备UP,则val=NETDEV_UP,v=dev;
3)取消注册
extern int notifier_chain_unregister(struct notifier_block **nl, struct notifier_block *n);
说明:从某个notifier_block链中移去n;
3。返回值
#define NOTIFY_DONE 0x0000 /* Don't care */
#define NOTIFY_OK 0x0001 /* Suits me */
#define NOTIFY_STOP_MASK 0x8000 /* Don't call further */
#define NOTIFY_BAD (NOTIFY_STOP_MASK|0x0002) /* Bad/Veto action */
参考文章:
1。数据结构
struct notifier_block
{
int (*notifier_call)(struct notifier_block *self, unsigned long, void *); /*回调处理函数*/
struct notifier_block *next;
int priority;
/*用于对注册者进行优先级排队,高优先级的处理例程将被优先执行,由注册者 自己指定 */
};
2。基本例程
1) 先注册到某个notifier_block链;
extern int notifier_chain_register(struct notifier_block **list, struct notifier_block *n);
说明:这时的n可以只要初始化(*notifier_call)指针;
2)当事件发生时,调用notifier_call_chain()来触发相应的处理函数。
extern int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v);
说明:轮循执行某个notifier_block链中的所有notifier_block,对其(*notifier_call)传入参数val和*v;
其中val应该是EVENT NUMBER,而*v是导致这个事件的数据结构,比如某个网络设备UP,则val=NETDEV_UP,v=dev;
3)取消注册
extern int notifier_chain_unregister(struct notifier_block **nl, struct notifier_block *n);
说明:从某个notifier_block链中移去n;
3。返回值
#define NOTIFY_DONE 0x0000 /* Don't care */
#define NOTIFY_OK 0x0001 /* Suits me */
#define NOTIFY_STOP_MASK 0x8000 /* Don't call further */
#define NOTIFY_BAD (NOTIFY_STOP_MASK|0x0002) /* Bad/Veto action */
参考文章: