接著 上一篇 “工作隊列 的變化”
寫了個例子,代碼如下:
#include <linux/workqueue.h><br />#include <linux/module.h> // kmalloc ...<br />#include <linux/sysctl.h><br />int submit_work(void (*func)(struct work_struct *work), void* data);<br />struct workqueue_struct* wq = NULL;<br />typedef struct {<br />void* data_for_work;<br />struct work_struct my_work;<br />} mydrv_t;<br />void func(struct work_struct *work)<br />{<br />mydrv_t* mydrv = container_of(work, mydrv_t, my_work);<br />printk("In func: %d received./n", (int)(mydrv->data_for_work));<br />}<br />/* Driver initialization */<br />static int __init mydrv_init(void)<br />{<br />int data = 1;<br />printk("Hello, small world!/n");<br />wq = create_singlethread_workqueue("g_queue");<br />submit_work(func, (void*) data);<br />submit_work(func, (void*)(data + 1));</p><p>return 0;<br />}<br />/* Work submission. The first argument is the work function,<br /> and the second argument is the argument to the work function */<br />int submit_work(void (*func)(struct work_struct *work), void * data)<br />{<br />mydrv_t* test;<br />test = (mydrv_t*)kmalloc(sizeof(mydrv_t), GFP_KERNEL);<br />memset(test, 0, sizeof(mydrv_t));<br />/* Init the work structure */<br />INIT_WORK(&(test->my_work), func);</p><p>test->data_for_work = data;<br />/* Enqueue Work */<br />queue_work(wq, &(test->my_work));<br />return 0;<br />}<br />static void mydrv_exit(void)<br />{<br />printk("cruel world, /n bye ,my dear!/n");<br />destroy_workqueue(wq);<br />}<br />module_init(mydrv_init);<br />module_exit(mydrv_exit);<br />//EXPORT_SYMBOL_GPL(queue_work);<br />MODULE_LICENSE("GPL");
編譯執行後發現:
#ps -ef
...
root 5933 2 0 00:59 ? 00:00:00 [Josephdrv] <------<<<< 這裡這個線程在模組移除後,仍然不退出,不知道什麼原因
root 7572 2 0 01:50 ? 00:00:00 [g_queue]
...