schedule_delayed_work 是 Linux 内核中用于延迟执行工作的函数。它的主要作用是将一个任务(work)安排在指定的延迟时间后在内核全局工作队列中执行[1][2].
函数原型如下:
static inline bool schedule_delayed_work(struct delayed_work *dwork,
unsigned long delay)
其中:
- dwork: 要执行的延迟工作(delayed work)
- delay: 延迟时间,单位为 jiffies[1][2]
使用方法:
-
通常将毫秒转换为 jiffies:
schedule_delayed_work(&work, msecs_to_jiffies(poll_interval));
-
当指定的延迟时间到达时,delayed_work 结构体中的 work 成员的 func() 函数会被执行[1].
-
对于周期性任务,可以在工作函数中再次调用 schedule_delayed_work() 来实现循环执行[1][2].
schedule_delayed_work() 实际上是对 queue_delayed_work() 的封装,它使用系统全局工作队列 system_wq[3]:
return queue_delayed_work(system_wq, dwork, delay);
如果需要取消已经安排的延迟工作,可以使用以下函数:
- cancel_delayed_work(): 尝试取消延迟工作,但不等待正在执行的工作完成[2].
- cancel_delayed_work_sync(): 取消延迟工作并等待它完成执行[1][2].
使用 schedule_delayed_work() 的优势在于它将工作交给内核线程执行,避免在中断上下文中执行耗时操作,提高了系统的响应性和可靠性[7][8].
Citations:
[1] https://blog.csdn.net/yueni_zhao/article/details/127550651
[2] https://www.cnblogs.com/zhiminyu/p/17628497.html
[3] https://github.com/apachecn/apachecn-linux-zh/blob/master/docs/linux-device-driver-dev/03.md
[4] https://www.cnblogs.com/yanghong-hnu/p/4671350.html
[5] https://blog.csdn.net/xiaowen_10/article/details/7997017
[6] http://www.360doc.com/content/14/0221/21/5073814_354607390.shtml
[7] https://jasonblog.github.io/note/linux_kernel/ff08_wu_ff09_ff1a_xia_ban_bu_ji_zhi_zhi_gong_zuo_d.html
[8] https://juejin.cn/post/6844903649756315655