可以使用两种方法:等待队列和完成变量
(1)等待队列
1)先定义全局变量:
int flags = 0;
wait_queue_head_t select_wait;
2)在初始化函数中初始化等待队列头:
init_waitqueue_head(&select_wait);
3)等待事件的发生或条件的满足:
wait_event_interruptible_timeout(select_wait, flags != 0, HZ/10);
4)条件满足后唤醒等待队列:
if(waitqueue_active(&select_wait))
{
flags=1;
wake_up_interruptible(&select_wait);
}
(2)完成变量
1)定义一个完成变量:
struct completion my_completion;
2)初始化这个完成变量:
init_completion(&my_completion);
1)~2)也可以通过静态的方式完成:
DECLEARE_COMPLETION(my_completion);
3)等待completion:
wait_for_completion_interruptible_timeout(&my_completion, msecs_to_jiffies(100)); // 100ms
4) 唤醒completion:
complete(&my_completion);