Linux work queue 笔记(半原创)
2011-10-21 21:43
323 查看
R: 工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许被重新调度甚至是睡眠。
struct work_struct{
unsigned long pending; /* 这个工作正在等待处理吗?*/
struct list_head entry; /* 连接所有工作的链表 */
void (*func) (void *); /* 要执行的函数 */
void *data; /* 传递给函数的参数 */
void *wq_data; /* 内部使用 */
struct timer_list timer; /* 延迟的工作队列所用到的定时器 */
};
DECLARE_WORK(name, void (*func) (void *), void *data);
INIT_WORK(struct work_struct *work, woid(*func) (void *), void *data);
schedule_work(&work);
work马上就会被调度,一旦其所在的处理器上的工作者线程被唤醒,它就会被执行。
可以调度它在指定的时间执行:
schedule_delayed_work(&work, delay);
example:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/workqueue.h>
static struct workqueue_struct *queue = NULL;
static struct work_struct work;
static void work_handler(struct work_struct *data)
{
printk(KERN_ALERT “work handler function.\n”);
}
static int __init test_init(void)
{
queue = create_singlethread_workqueue(“helloworld”); /*创建一个单线程的工作队列*/
if (!queue)
goto err;
INIT_WORK(&work, work_handler);
schedule_work(&work);
return 0;
err:
return -1;
}
static void __exit test_exit(void)
{
destroy_workqueue(queue);
}
MODULE_LICENSE(“GPL”);
module_init(test_init);
module_exit(test_exit);
推荐个文章:/article/2889978.html
struct work_struct{
unsigned long pending; /* 这个工作正在等待处理吗?*/
struct list_head entry; /* 连接所有工作的链表 */
void (*func) (void *); /* 要执行的函数 */
void *data; /* 传递给函数的参数 */
void *wq_data; /* 内部使用 */
struct timer_list timer; /* 延迟的工作队列所用到的定时器 */
};
DECLARE_WORK(name, void (*func) (void *), void *data);
INIT_WORK(struct work_struct *work, woid(*func) (void *), void *data);
schedule_work(&work);
work马上就会被调度,一旦其所在的处理器上的工作者线程被唤醒,它就会被执行。
可以调度它在指定的时间执行:
schedule_delayed_work(&work, delay);
example:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/workqueue.h>
static struct workqueue_struct *queue = NULL;
static struct work_struct work;
static void work_handler(struct work_struct *data)
{
printk(KERN_ALERT “work handler function.\n”);
}
static int __init test_init(void)
{
queue = create_singlethread_workqueue(“helloworld”); /*创建一个单线程的工作队列*/
if (!queue)
goto err;
INIT_WORK(&work, work_handler);
schedule_work(&work);
return 0;
err:
return -1;
}
static void __exit test_exit(void)
{
destroy_workqueue(queue);
}
MODULE_LICENSE(“GPL”);
module_init(test_init);
module_exit(test_exit);
推荐个文章:/article/2889978.html
相关文章推荐
- 【原创】linux学习笔记之文件处理命令
- (原创)Linux内核网络设备操作部分阅读笔记
- [原创] linux课堂-学习笔记-目录及概况
- linux work queue的两种调度方式
- Linux设备驱动之中断---work_queue使用示例
- linux下的oom调试笔记【原创】
- linux work queue
- [原创][Linux初学笔记]之DNS服务器的配置(图解)
- Linux Workqueue——魅族内核大神文章
- linux 工作队列之queue_work
- [原创] linux课堂-学习笔记-课程3.Linux目录结构介绍及内核与shell分析
- [原创]Linux 2.6.27 for ARM9/S3C2410 内核移植笔记
- 【原创】Linux学习笔记
- tasklet and workqueue(from linux kernel development )
- linux work queue & work struct解析
- linux workqueue 工作队列
- linux字符设备学习笔记【原创】
- linux workqueue
- linux workqueue 原理解析
- 原创:linux添加scsi硬盘笔记