|
- static wait_queue_head_t n_wait;
- int notified = 0;
- /*通知等待队列,唤醒任务*/
- void notify_dont_wait() {
- notified = 1;
- wake_up_interruptible(&n_wait);
- }
- /*把任务加入等待队列中,并且至多等待5秒,5秒钟后得不到通知那么超时*/
- void wait_no_more_than_5sec() {
- DECLARE_WAITQUEUE(wait, current);
- add_wait_queue(&n_wait, &wait);
- wait_event_interruptible_timeout(n_wait,notified == 1,HZ * 5);
- if(!notified) {
- printk("time out\n");
- } else {
- printk("got the notification during 5 seconds\n");
- }
-
- remove_wait_queue(&n_wait,&wait);
- }
- /* 测试*/
- void test() {
- wait_no_more_than_5sec();
- /*把notify_dont_wait作为一个回调函数交给some_func函数,
- some_func函数在处理完后在一定的条件满足后可能会调用notify_dont_wait*/
- some_func(notify_dont_wait);
- }
复制代码
这里我有一点比较迷惑,就是DECLARE_WAITQUEUE(wait, current);的current对应的是一个指向结构task_struct的指针,也就是说current代表的是一个用户进程,那么如果编写的内核模块和用户进程没有任何关系的话(比如说netfilter),那么难道就不能使用Linux内核中的等待队列了吗?或者current需要改成别的什么? |
|