queue_delayed_work 却没有实际调用
时间: 2023-08-05 16:05:05 浏览: 157
您好,我可以回答您的问题。queue_delayed_work 是 Linux kernel 中的一个函数,用于将一个工作任务加入到内核工作队列中,但它并不会立即执行该任务,而是会在指定的时间后再执行。如果该函数没有被实际调用,那么就不会有任何工作任务被加入到内核工作队列中,也就不会被执行。请问您还有其他的问题吗?
相关问题
queue_delayed_work
`queue_delayed_work` 是 Linux 内核中用于将工作(work)延迟执行的函数。该函数会在指定的时间后将工作放入工作队列(workqueue)中,并在工作队列的上下文中执行。
具体来说,`queue_delayed_work` 函数将一个 `delayed_work` 结构体加入到工作队列中,并将其延迟执行指定的时间。`delayed_work` 结构体包含一个工作函数指针和一个工作队列项(workqueue_item),当该项被处理时,工作函数将被执行。
以下是一个使用 `queue_delayed_work` 的示例:
```c
#include <linux/workqueue.h>
#include <linux/delay.h>
static struct delayed_work my_delayed_work;
static void my_work_fn(struct work_struct *work)
{
printk(KERN_INFO "my_work_fn executed\n");
}
static int __init my_init(void)
{
printk(KERN_INFO "my_init called\n");
INIT_DELAYED_WORK(&my_delayed_work, my_work_fn);
queue_delayed_work(system_wq, &my_delayed_work, msecs_to_jiffies(1000));
return 0;
}
static void __exit my_exit(void)
{
printk(KERN_INFO "my_exit called\n");
cancel_delayed_work_sync(&my_delayed_work);
}
module_init(my_init);
module_exit(my_exit);
```
在上述示例中,我们定义了一个 `delayed_work` 结构体 `my_delayed_work`,并初始化其工作函数为 `my_work_fn`。然后,我们调用 `queue_delayed_work` 函数将该工作项加入到系统工作队列中并延迟执行 1 秒。最后,在模块退出时,我们调用 `cancel_delayed_work_sync` 函数取消该工作项的延迟执行。
queue_delayed_work源码
`queue_delayed_work()` 是 Linux 内核中的一个函数,它的作用是将一个 `work_struct` 结构体中表示的工作延迟一段时间后放入工作队列中,以便稍后执行。
以下是 `queue_delayed_work()` 函数的源码:
```c
int queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work,
unsigned long delay)
{
unsigned long flags;
int ret = 0;
spin_lock_irqsave(&wq->lock, flags);
if (work_pending(&work->work)) {
/*
* We always return 0 if the work item was already on a
* queue. The idea is that the caller can still rely on
* the work_struct being on a workqueue queue if they
* use flush_workqueue().
*/
ret = 0;
goto out_unlock;
}
/* initialize the delay */
work->timer.expires = jiffies + delay;
/* initialize the function to be called when the timer expires */
work->timer.function = delayed_work_timer_fn;
/* initialize the private data of the timer */
work->timer.data = work;
/* add the timer to the timer list */
add_timer_on(&work->timer, wq->rt);
__queue_work(wq, &work->work, &work->entry);
out_unlock:
spin_unlock_irqrestore(&wq->lock, flags);
return ret;
}
```
该函数的参数包括:
- `wq`:指向工作队列对象的指针;
- `work`:指向 `delayed_work` 结构体的指针;
- `delay`:表示要延迟的时间。
该函数的主要步骤包括:
1. 锁定工作队列的自旋锁;
2. 检查工作是否已经在队列中,如果是则返回 0;
3. 初始化 `delay` 并将工作添加到工作队列中;
4. 解锁工作队列的自旋锁并返回执行结果。
在添加工作到队列之前,`queue_delayed_work()` 函数会先初始化一个定时器,并将其添加到定时器列表中。当定时器到期时,内核会调用 `delayed_work_timer_fn()` 函数,该函数会将 `delayed_work` 结构体中的工作添加到工作队列中以便稍后执行。
阅读全文