在Linux驱动程序中,可以使用等待队列(Wait Queue)来实现阻塞进程的唤醒。

1.定义“等待队列头部”

wait_queue_head_t my_queue;

  wait_queue_head_t是__wait_queue_head结构体的一个typedef。

2.初始化“等待队列头部”

init_waitqueue_head(&my_queue);

  而下面的DECLARE_WAIT_QUEUE_HEAD()宏可以作为定义并初始化等待队列头部的“快捷方式”。

DECLARE_WAIT_QUEUE_HEAD (name)

3.定义等待队列元素

DECLARE_WAITQUEUE(name, tsk)

  该宏用于定义并初始化一个名为name的等待队列元素。

4.添加/移除等待队列

void add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
void remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait); 

add_wait_queue()用于将等待队列元素wait添加到等待队列头部q指向的双向链表中,而
remove_wait_queue()用于将等待队列元素wait从由q头部指向的链表中移除。

5.等待事件

wait_event(queue, condition)
wait_event_interruptible(queue, condition)
wait_event_timeout(queue, condition, timeout)
wait_event_interruptible_timeout(queue, condition, timeout)  

等待第1个参数queue作为等待队列头部的队列被唤醒,而且第2个参数condition必须满足,否则继续
阻塞。wait_event()和wait_event_interruptible()的区别在于后者可以被信号打断,而前者不能。加上
_timeout后的宏意味着阻塞等待的超时时间,以jiffy为单位,在第3个参数的timeout到达时,不论condition
是否满足,均返回。

函数原型:

#define wait_event_interruptible(wq, condition) \
({ \
int __ret = 0; \
if (!(condition)) \
__wait_event_interruptible(wq, condition, __ret); \
__ret; \
})
@wq:等待队列,创建等待队列查看 

@condition:当是0时候进程进入休眠,是1的时候继续往下运行

6.唤醒队列

void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *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_interruptible()只能唤醒处于
TASK_INTERRUPTIBLE的进程。

最新文章

  1. samba服务配置
  2. Adaboost 算法的原理与推导
  3. php 支持断点续传的文件下载类
  4. [转]ubuntu下安装程序的三种方法
  5. HTML5入门十---Canvas画布实现画图(一)
  6. C# 中控件 WebBrowser 对 frameset/ iframe 操作和内容获取
  7. wcf长连接
  8. echarts样式修改
  9. (译)UEFI 启动:实际工作原理
  10. [SCOI2007]最大土地面积
  11. selenium2自动化测试学习笔记(三)
  12. 无service.bat的tomcat服务怎么设置自启动
  13. C++运算符重载——输入/输出运算符
  14. 解决maven编译Java中的使用了未经检查或不安全的操作
  15. Java如何读取和下载网页?
  16. ORA-01841: (full) year must be between -4713 and +9999,
  17. PM2报错‘Spawning PM2 daemon with pm2_home...’的解决方案
  18. linux 将一个文件分解成多个不同名文件
  19. hdoj1069 Monkey and Banana(DP--LIS)
  20. 解决iText2.0.8+freemark导出pdf不支持base64的解决办法

热门文章

  1. 【git】3.5 git分支-远程分支
  2. VMware vSphere Client(4.1/5.0/5.1/5.5/6.0) 客户端下载地址
  3. logback-spring.xml配置说明
  4. 百题计划-4 codeforces 652 div2 D. TediousLee 找规律
  5. Jmeter 实现Json格式接口测试
  6. windows sshd powershell 配置
  7. 取得SAP服务器主机名(host name)和端口号(port)函数[TH_GET_VIRT_HOST_DATA]
  8. 【Tomcat】ubuntu系统安装Tomcat
  9. 自我察觉 vs 自我意识
  10. python 的sys.argv 和 sys.path.append() 用法和PYTHONPATH环境变量