LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1438|回复: 3

关于内核中的等待通知的方法

[复制链接]
发表于 2008-6-14 16:32:45 | 显示全部楼层 |阅读模式
  1. static wait_queue_head_t n_wait;
  2. int notified = 0;
  3. /*通知等待队列,唤醒任务*/
  4. void notify_dont_wait() {
  5.         notified = 1;
  6.         wake_up_interruptible(&n_wait);
  7. }
  8. /*把任务加入等待队列中,并且至多等待5秒,5秒钟后得不到通知那么超时*/
  9. void wait_no_more_than_5sec() {
  10.         DECLARE_WAITQUEUE(wait, current);
  11.         add_wait_queue(&n_wait, &wait);
  12.         wait_event_interruptible_timeout(n_wait,notified == 1,HZ * 5);
  13.         if(!notified) {
  14.                 printk("time out\n");
  15.         } else {
  16.                 printk("got the notification during 5 seconds\n");
  17.         }
  18.        
  19.         remove_wait_queue(&n_wait,&wait);
  20. }
  21. /* 测试*/
  22. void test() {
  23.         wait_no_more_than_5sec();
  24.         /*把notify_dont_wait作为一个回调函数交给some_func函数,
  25.         some_func函数在处理完后在一定的条件满足后可能会调用notify_dont_wait*/
  26.         some_func(notify_dont_wait);
  27. }
复制代码

这里我有一点比较迷惑,就是DECLARE_WAITQUEUE(wait, current);的current对应的是一个指向结构task_struct的指针,也就是说current代表的是一个用户进程,那么如果编写的内核模块和用户进程没有任何关系的话(比如说netfilter),那么难道就不能使用Linux内核中的等待队列了吗?或者current需要改成别的什么?
 楼主| 发表于 2008-6-16 17:20:46 | 显示全部楼层
怎么没有人理睬,进来的都吱一下嘛!
回复 支持 反对

使用道具 举报

发表于 2008-7-3 20:29:02 | 显示全部楼层
current不是指向一个特定用户进程,他指向当前正在执行的进程
回复 支持 反对

使用道具 举报

发表于 2008-7-13 23:59:17 | 显示全部楼层
同意楼上的
这段代码就是让自己休眠一段时间
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表