linux 等待队列 第三篇
2013-07-11 09:52
155 查看
1、为什么要使用等待队列?等待队列就是阻塞型字符设备驱动的必需品。阻塞型就是说某个设备可读或者可写,但是呢,某个时候这个设备没有东西给你读,但你的应用程序(进程)操作却要向设备去读取数据,那没办法,要么就出错,要么就阻塞着在那里等着要读取数据。一旦设备有东西可以给你读了,进程就可以继续进行读操作了。
2、定义并初始化等待队列。
(1) 定义"等待队列头"
wait_queue_head_t my_queue;
(2) 初始化"等待队列头"
init_waitqueue_head(&my_queue);
定义和初始化的快捷方式:
DECLARE_WAIT_QUEUE_HEAD(my_queue);
3、哪里去使用等待队列?在你的操作函数里。比如读操作或者写操作。
wait_event(queue, condition);
wait_event_interruptible(queue, condition);
wait_event_timeout(queue, condition, timeout);
wait_event_interruptible_timeout(queue, condition, timeout);
等待第一个参数queue作为等待队列头的等待队列被唤醒,而且第二个参数condition必须满足,否则阻塞。wait_event()和wait_event_interruptible()的区别在于后者可以被信号打断,而前者不能。加上timeout后的宏意味着阻塞等待的超时时间,以jiffy为单位,在第三个参数的timeout到达时,不论condition是否满足,均返回。
4、哪里唤醒,怎么唤醒?唤醒的方式要对应等待的事件。
void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);
上述操作会唤醒以queue作为等待队列头的所有等待队列对应的进程。
wake_up() <---> wait_event()
wait_event_timeout()
wake_up_interruptible() <---> wait_event_interruptible()
wait_event_interruptible_timeout()
wake_up()可以唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE的进程
wake_up_interruptble()只能唤醒处于TASK_INTERRUPTIBLE的进程。
唤醒操作一般是在中断程序里面执行的。还要记得condition要赋值为真才能真正唤醒!!
来源:http://markter.blog.163.com/blog/static/173553995201182875330918/
2、定义并初始化等待队列。
(1) 定义"等待队列头"
wait_queue_head_t my_queue;
(2) 初始化"等待队列头"
init_waitqueue_head(&my_queue);
定义和初始化的快捷方式:
DECLARE_WAIT_QUEUE_HEAD(my_queue);
3、哪里去使用等待队列?在你的操作函数里。比如读操作或者写操作。
wait_event(queue, condition);
wait_event_interruptible(queue, condition);
wait_event_timeout(queue, condition, timeout);
wait_event_interruptible_timeout(queue, condition, timeout);
等待第一个参数queue作为等待队列头的等待队列被唤醒,而且第二个参数condition必须满足,否则阻塞。wait_event()和wait_event_interruptible()的区别在于后者可以被信号打断,而前者不能。加上timeout后的宏意味着阻塞等待的超时时间,以jiffy为单位,在第三个参数的timeout到达时,不论condition是否满足,均返回。
4、哪里唤醒,怎么唤醒?唤醒的方式要对应等待的事件。
void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);
上述操作会唤醒以queue作为等待队列头的所有等待队列对应的进程。
wake_up() <---> wait_event()
wait_event_timeout()
wake_up_interruptible() <---> wait_event_interruptible()
wait_event_interruptible_timeout()
wake_up()可以唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE的进程
wake_up_interruptble()只能唤醒处于TASK_INTERRUPTIBLE的进程。
唤醒操作一般是在中断程序里面执行的。还要记得condition要赋值为真才能真正唤醒!!
来源:http://markter.blog.163.com/blog/static/173553995201182875330918/
相关文章推荐
- linux中的等待队列
- Linux驱动中的阻塞与非阻塞I/O,等待队列,轮询操作
- Linux中等待队列机制分析
- Linux 等待队列
- Linux&nbsp;等待队列
- Linux等待队列
- Linux中等待队列的实现
- linux 等待队列 第二篇
- Linux驱动阻塞与非阻塞IO之等待队列
- linux 等待队列 PK linux 等待队列头
- Linux驱动学习——等待队列
- Linux&nbsp;等待队列
- Linux中等待队列机制分析
- linux驱动---等待队列、工作队列、Tasklets
- linux 字符驱动阻塞型 等待队列
- Linux使用wake_up_interruptible()唤醒注册到等待队列上的进程
- Linux内核等待队列的使用方法总结
- Linux 工作队列和等待队列的区别
- linux 等待队列
- linux等待队列