我總結出的內核工作隊列中的4種用法
1. 使用系統的工作隊列(不延遲)
1)定義一個工作:
struct work_struct my_work;
2)編寫一個函數:
void my_work_func (struct work_struct *p_work) { printk("work func\n"); }
3)將工作和函數綁定(一般在open函數里面執行)
INIT_WORK(&my_work, my_work_func);
4)調度工作(實際上是加入到系統的工作隊列中)
schedule_work(&my_work);
2. 使用系統的工作隊列(延遲)
1)定義一個延遲工作
struct delayed_work my_delayed_work;
2)編寫一個函數
void my_work_func (struct work_struct *p_work) { printk("work func\n"); }
3)將延遲工作和函數綁定(一般在open函數里進行)
INIT_DELAYED_WORK(&my_delayed_work, my_work_func);
4)調度工作(實際上是加入系統的工作隊列中)
schedule_delayed_work(&my_delayed_work, 2);
schedule_delayed_work函數傳入的第二個參數為系統的節拍數,一般系統默認為200Hz,因此2個節拍表示10ms,10ms之后再調用工作中的函數。
3. 使用自己的工作隊列(不延遲)
1)定義一個自己的工作隊列指針
struct workqueue_struct *p_my_workqueue;
2)創建一個工作隊列,並接收返回值,可以用create_singlethread_workqueue或者create_workqueue,這一步一般在open函數中實現。
p_my_workqueue = create_singlethread_workqueue("my_workqueue");
//p_my_workqueue = create_workqueue("my_workqueue");
3)定義一個工作
struct work_struct my_work;
4)編寫一個函數
void my_work_func (struct work_struct *p_work) { printk("work func\n"); }
5)將工作和函數綁定(一般在open函數里面執行)
INIT_WORK(&my_work, my_work_func);
6)將工作插入工作隊列中便會調用工作中注冊的函數
queue_work(p_my_workqueue, &my_work);
7)銷毀工作隊列
destroy_workqueue(p_my_workqueue);
4. 使用自己的工作隊列(延遲)
1)定義一個自己的工作隊列指針
struct workqueue_struct *p_my_workqueue;
2)創建一個工作隊列,並接收返回值,可以用create_singlethread_workqueue或者create_workqueue,這一步一般在open函數中實現。
p_my_workqueue = create_singlethread_workqueue("my_workqueue");
//p_my_workqueue = create_workqueue("my_workqueue");
3)定義一個延遲工作
struct delayed_work my_delayed_work;
4)編寫一個函數
void my_work_func (struct work_struct *p_work)
{
printk("work func\n"); }
5)將延遲工作和函數綁定(一般在open函數里進行)
INIT_DELAYED_WORK(&my_delayed_work, my_work_func);
6)將工作插入工作隊列中,n個節拍之后便會調用工作中注冊的函數(n為queue_delayed_work函數中最后一個參數)
queue_delayed_work(p_my_workqueue, &my_delayed_work, 2);
7)銷毀工作隊列
destroy_workqueue(p_my_workqueue);
推薦文章:https://www.ibm.com/developerworks/cn/linux/l-cn-cncrrc-mngd-wkq/