Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82683
  • 博文数量: 19
  • 博客积分: 580
  • 博客等级: 中士
  • 技术积分: 187
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-25 09:03
文章分类

全部博文(19)

文章存档

2011年(9)

2010年(9)

2009年(1)

我的朋友

分类: LINUX

2010-05-18 11:00:31

Linux内核协议栈大量使用通知链这种技术,用法如下:
1) 定义一个通知链BLOCKING_NOTIFIER_HEAD(my_event_chain)。
2) 定义一个通知块struct notifier_block my_event_block = {
.notifier_call =my_event_process_func, };
3) 使用blocking_notifier_chain_register(my_event_block)把这个通知块挂接到my_event_chain。
4) 另一处代码调用blocking_notifier_call_chain(my_event_chain),那么就把一个事件发送到对应的通知块上,对应的处理函数就会处理事件。
内部实现是这样的blocking_notifier_call_chain内部调用notifier_call_chain,这个函数内部会遍历通知链,然后以此执行通知块上的回调函数:

1. int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)
2. {
3. int ret=NOTIFY_DONE;
4. struct notifier_block *nb = *n;
5.
6. while(nb)
7. {
8. ret=nb->notifier_call(nb,val,v);
如果执行环境处于调试中断中,那么可以退出遍历
9. if(ret&NOTIFY_STOP_MASK)
10. {
11. return ret;
12. }
13. nb=nb->next;
14. }
15. return ret;
16. }
代码段 2-14 notifier_call_chain函数 从代码上看,所谓通知链并不是真正的“通知”方式,而是直接回调方式,这就要保证不写出递归很多次的代码,以免内核栈被撑死。
阅读(1391) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~