博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内核线程的简单使用
阅读量:6253 次
发布时间:2019-06-22

本文共 2620 字,大约阅读时间需要 8 分钟。

hot3.png

    内核线程是工作在内核空间的,不属于任何一个进程,可以发生睡眠。内核线程的相关代码在:include/linux/kthread.h , kernel/kthread.c

    1. 创建并启动一个内核线程

struct task_struct *kthread_create(int (*threadfn)(void *data),                               void *data,                               const char namefmt[], ...); /** * kthread_run - create and wake a thread. * @threadfn: the function to run until signal_pending(current). * @data: data ptr for @threadfn. * @namefmt: printf-style name for the thread. * * Description: Convenient wrapper for kthread_create() followed by * wake_up_process().  Returns the kthread or ERR_PTR(-ENOMEM). */#define kthread_run(threadfn, data, namefmt, ...)                        \({                                                               \       struct task_struct *__k                                        \              = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \       if (!IS_ERR(__k))                                        \              wake_up_process(__k);                                \       __k;                                                     \})

    其中kthread_create()只是创建一个内核线程,但并没有启动,需要调用wake_up_process()来启动线程,所以内核又帮我们定义了一个宏kthread_run来帮我们搞定。内核线程创建成功后,会返回一个struct task_struct对象指针,方便我们的后续操作。

    2. 关闭一个内核线程:

int kthread_stop(struct task_struct *k);

    这个调用是会阻塞等待,直到内核线程k退出为止。原因为因为此函数内部会调用wait_for_completion()的方法(通过等待队列来实现),阻塞等待内核线程自身的退出。

    3.内核线程函数,如何判断自身需要退出:

 int kthread_should_stop(void);

如果该内核线程已经被设置stop标志了,则会返回1,否则返回0。

    4. 一个简单的例子:

    在模块初始化的时候创建一个内核线程,此内核线程的功能是每隔2秒中打印一条信息。当我们卸载模块的时候,会关闭该内核线程。

#include 
#include 
#include 
  #define ENTER() printk(KERN_DEBUG "%s() Enter", __func__)#define EXIT() printk(KERN_DEBUG "%s() Exit", __func__)#define ERR(fmt, args...) printk(KERN_ERR "%s()-%d: " fmt "\n", __func__, __LINE__, ##args)#define DBG(fmt, args...) printk(KERN_DEBUG "%s()-%d: " fmt "\n", __func__, __LINE__, ##args) MODULE_LICENSE("GPL"); static int demo_thr(void *data){    ENTER();    while (!kthread_should_stop()) {        DBG("kthread is running");        msleep_interruptible(2000);    }     EXIT();    return 0;} static struct task_struct *thr = NULL; static __init int kthread_demo_init(void){    ENTER();     thr = kthread_run(demo_thr, NULL, "kthread-demo");    if (!thr) {        ERR("kthread_run fail");        return -ECHILD;    }     EXIT();    return 0;} static __exit void kthread_demo_exit(void){    ENTER();    if (thr) {        DBG("kthread_stop");        kthread_stop(thr);        thr = NULL;    }       EXIT();} module_init(kthread_demo_init);module_exit(kthread_demo_exit);

转载于:https://my.oschina.net/kaedehao/blog/621810

你可能感兴趣的文章
递归函数的概念使用方法与实例
查看>>
RMAN_学习笔记4_RMAN Virtual Catalog虚拟恢复目录
查看>>
cf451C-Predict Outcome of the Game
查看>>
struct dev_t
查看>>
Java 原型模式
查看>>
【转】Android4.3 蓝牙BLE初步
查看>>
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
查看>>
hadoop2.0 和1.0的区别
查看>>
手机web——自适应网页设计(html/css控制) - 51CTO.COM
查看>>
ibatis resultMap 的用法
查看>>
Protocol Buffer技术详解(数据编码)
查看>>
【javascript】ajax 基础
查看>>
2015 UESTC 搜索专题N题 韩爷的梦 hash
查看>>
MySQL 二进制日志过滤
查看>>
Centos下Tomcat 安装Apache Portable Runtime
查看>>
【BZOJ】2563: 阿狸和桃子的游戏
查看>>
redis 中文字符显示
查看>>
webview与JS的交互
查看>>
吴翼大神
查看>>
在Gridview如何进行每行单元格比较
查看>>