1
2
|
wait_event_interruptible(queue,condition)
//当condition(一个布尔表达式)为真时,立即返回;
//否则让进程进入TASK_INTERRUPTIBLE的睡眠,并挂在名为queue所指定的等待队列上。
|
1
2
3
4
5
6
7
|
#define wait_event_interruptible(wq, condition)
({
int
__ret = 0;
if
(!(condition))
__wait_event_interruptible(wq, condition, __ret);
__ret;
})
|
1
2
3
4
5
6
7
8
9
|
#define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)
void
fastcall __wake_up(wait_queue_head_t *q, unsigned
int
mode,
int
nr_exclusive,
void
*key)
{
unsigned
long
flags;
spin_lock_irqsave(&q->lock, flags);
__wake_up_common(q, mode, nr_exclusive, 0, key);
spin_unlock_irqrestore(&q->lock, flags);
}
|
1
2
3
4
|
#define DECLARE_WAIT_QUEUE_HEAD(name) wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
#define __WAIT_QUEUE_HEAD_INITIALIZER(name) {
.lock = __SPIN_LOCK_UNLOCKED(name.lock),
.task_list = { &(name).task_list, &(name).task_list } }
|
1
2
|
wait_queue_head_t my_queue;
init_waitqueue_head(&my_queue);
|
1
2
3
4
5
6
|
init_waitqueue_head(&my_queue)的内核代码
void
init_waitqueue_head(wait_queue_head_t *q)
{
spin_lock_init(&q->lock);
INIT_LIST_HEAD(&q->task_list);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
staticDECLARE_WAIT_QUEUE_HEAD(queue);
staticintflag =0;
staticirqreturn_t irq_handle(intirq,
void
*dev__id){
//printk("irq = %d\n", irq);
//..........其他代码.............
flag = 1;
wake_up_interruptible(&queue);
returnIRQ_RETVAL(IRQ_HANDLED);
//warn:杩斿洖IRQ_HANDLED
}
ssize_t XXXXX_read(structfile *filp,char__user *buf,size_tcount,loff_t *pos)
{
//pirntk(KERN_DEBUG "process %i (%s) going to sleep\n",current->pid,current->comm);
wait_event_interruptible(queue,flag);
//此时进程被加入等待队列,等待中断发生
flag=0;
//printk(KERN_DEBUG "awoken %i (%s) \n",current->pid,current->comm);
returncount;
//这个count变量看自己需要更改
}
|