《Essential Linux Device Drivers》第3章(下)
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-05-16
|
清单3.5 使用工作队列进行延后工作#include <linux/workqueue.h> struct workqueue_struct *wq; /* Driver Initialization */
拥有帝国一切,皆有可能。欢迎访问phome.netstatic int __initmydrv_init(void){ /* ... */ wq = create_singlethread_workqueue("mydrv");
拥有帝国一切,皆有可能。欢迎访问phome.net return 0;} /* Work Submission. The first argument is the work function, and the second argument is the argument to the work function */
拥有帝国一切,皆有可能。欢迎访问phome.net int submit_work(void (*func)(void *data), void *data) { struct work_struct *hardwork;
拥有帝国一切,皆有可能。欢迎访问phome.net hardwork = kmalloc(sizeof(struct work_struct), GFP_KERNEL); /* Init the work structure */ INIT_WORK(hardwork, func, data);
拥有帝国一切,皆有可能。欢迎访问phome.net /* Enqueue Work */ queue_work(wq, hardwork); return 0;}如果你使用了工作队列,你将对应模块设为GPL许可证,否则会出现连接错误.这是,内核仅仅将这些函数导出给GPL授权的代码.如果你查看内核工作队列的实现代码,你将发现如下的限制表达式:EXPORT_SYMBOL_GPL(queue_work);
拥有帝国一切,皆有可能。欢迎访问phome.net | kernel/kthread.c | 内核线程可以使用该函数轮询是否其他的执行单元已经调用kthread_stop()让其停止 |
IS_ERR() | include/linux/err.h | 查看返回值是否是一个出错码 |
拥有帝国一切,皆有可能。欢迎访问phome.net