linux内核--wait_event_interruptible_timeout()函数分析
来源:互联网 发布:网络战是未来趋势 编辑:程序博客网 时间:2024/05/17 07:36
网上有关于此函数的分析,但大都是同一篇文章转载来转载去,没有进一步的分析。做个小结:
了解函数功能,除了直接看代码逻辑,最有效的当是注释内容了。
如下:
函数原型:wait_event_interruptible_timeout(wq, condition, timeout)* 函数作用:~睡眠~,直到condition为真,或timeout超时;* @wq: 要等待的等待队列* @condition: 等待事件发生的条件(一个C表达式 )* @timeout: 超时时间程序是用来睡眠的(TASK_INTERRUPTIBLE状态下),直到@condition为真,或者收到一个信号。每次等待队列@wq被唤醒时,检查@condition;若有可以改变等待条件的任何更改操作,调用wake_up();如果@timeout超时,函数返回0;如果是被信号中断,函数返回-ERESTARTSYS;在超时之前condition 为true,否则继续剩余的jiffies 。
理解所需:
1,TASK_INTERRUPTIBLE是可以被信号和wake_up()唤醒的,当信号到来时,进程会被设置为可运行;而TASK_UNINTERRUPTIBLE只能被wake_up()唤醒。
2,信号是在软件层次上对中断机制的一种模拟,为软中断。
3,signal_pending(current) :检查当前进程是否有信号处理,返回值不为0则表示有信号需要处理。
返回 -ERESTARTSYS 表示信号函数处理完毕后重新执行信号函数前的某个系统调用。(此函数只检查是否有信号,不处理信号)
条件不满足,则产生信号、开始等待。若返回非0,则表示没有信号需要处理,继续循环重新开始系统调用;若返回0,则表示有信号需要处理,直接处理数据,系统调用正常结束。
4,schedule_timeout()用来让出CPU,在指定的时间用完以后或者其它事件到达并唤醒进程时(比如接收了一个信号量),该进程才可以继续运行.
[函数返回0表示timeout用完后被唤醒;返回整数表示timeout未用完时就被唤醒,此时可能接收到了一个信号量]
wait_event系列函数(作用:等待事件,置于休眠。区别从字面意思即可看出):
wait_event(queue, conditon);wait_event_interruptible(queue, condition);wait_event_timeout(queue, condition, timeout);wait_event_interruptible_timeout(queue, condition, timeout);*queue:作为等待队列头的等待队列被唤醒*conditon:必须满足,否则阻塞*【timeout和conditon相比,有更高优先级】
参考内核源码理解(在wait.h文件中)
#define __wait_event_interruptible_timeout(wq, condition, ret)do { DEFINE_WAIT(__wait); for (;;) { prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE); if (condition) break; if (!signal_pending(current)) { ret = schedule_timeout(ret); if (!ret) break; continue; } ret = -ERESTARTSYS; break; } finish_wait(&wq, &__wait); } while (0)/** * wait_event_interruptible_timeout - sleep until a condition gets true or a timeout elapses * @wq: the waitqueue to wait on * @condition: a C expression for the event to wait for * @timeout: timeout, in jiffies * * The process is put to sleep (TASK_INTERRUPTIBLE) until the * @condition evaluates to true or a signal is received. * The @condition is checked each time the waitqueue @wq is woken up. * * wake_up() has to be called after changing any variable that could * change the result of the wait condition. * * The function returns 0 if the @timeout elapsed, -ERESTARTSYS if it * was interrupted by a signal, and the remaining jiffies otherwise * if the condition evaluated to true before the timeout elapsed. */#define wait_event_interruptible_timeout(wq, condition, timeout) ({ long __ret = timeout; if (!(condition)) __wait_event_interruptible_timeout(wq, condition, __ret); __ret; })
0 0
- linux内核--wait_event_interruptible_timeout()函数分析
- linux内核schedule函数分析
- linux内核分析之signal.c函数
- Linux内核中mktime()函数算法分析
- Linux内核中start_kernel函数的分析
- Linux内核中mktime()函数算法分析
- linux内核启动第二阶段分析-setup_arch()函数
- linux内核calibrate_delay函数实现分析
- Linux-0.12内核sleep_on函数分析
- linux内核启动第二阶段分析-setup_arch()函数
- Linux内核---8.filechk函数分析
- Linux内核0.11版本schedule()函数分析
- Linux内核0.11版本sys_waitpid()函数分析
- linux内核中2410_gpio_cfgpin函数分析
- Linux内核分析课程3_start_kernel()函数分析
- 《Linux内核分析》-函数调用模型与堆栈分析
- 【Linux设备驱动程序(第三版)】----延迟:超时(wait_event_interruptible_timeout)
- Linux内核延时研究与函数代码分析
- Linux 开机执行一条shell命令
- 烫烫烫,锟斤拷
- kpush源码解析---服务端(alloc server)
- django-orm中F对象的使用
- 安卓的进程和线程
- linux内核--wait_event_interruptible_timeout()函数分析
- 结合EF5.0讲MVC4(一)--创建一个MVC4应用程序
- php闭包和匿名函数
- Binary Tree Postorder Traversal leetcode145
- linux实用命令以及部分笔记
- listView实现阻尼效果
- OpenGL开发之旅基础知识介绍
- mfc多视图的创建
- sql总结