内核线程是工作在内核空间的,不属于任何一个进程,可以发生睡眠。可以用内核线程来进行一些循环的动作,比如通过循环拉高拉低gpio设置成方波输出的信号来模拟pwm信号,比如循环控制led的闪灯效果等等都可以使用到内核线程kthread_create接口函数。

内核线程的相关代码目录:

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。

这里列举一个使用内核线程的简单的demo代码,可作为参考:

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

#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/delay.h>#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)static struct task_struct *test_kthread = NULL;    //定义一个task_struct结构体指针,赋值为NULLstatic int kthread_test_func(void)   //定义一个内核线程要执行的函数
{ENTER();while (!kthread_should_stop()) {DBG("kthread is running");msleep(5000);}EXIT();return 0;
}static __init int kthread_test_init(void)
{ENTER();test_kthread = kthread_run(kthread_test_func, NULL, "kthread-test");  //创建线程kthread-test,并且运行if (!test_kthread) {ERR("kthread_run fail");return -ECHILD;}EXIT();return 0;
}static __exit void kthread_test_exit(void)
{ENTER();if (test_kthread) {DBG("kthread_stop");kthread_stop(test_kthread); //停止内核线程test_kthread = NULL;}EXIT();
}module_init(kthread_test_init);
module_exit(kthread_test_exit);MODULE_AUTHOR("czd,214241976@qq.com");
MODULE_DESCRIPTION("Device_create Driver");
MODULE_LICENSE("GPL");

Linux创建内核线程kthread_create的用法介绍相关推荐

  1. linux 创建内核线程

    Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求).内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的.内核线程就是内核的分身,一个分身可以处理一 ...

  2. kthread_run创建内核线程的原理

    kthread_run是一个宏,用来创建一个进程,并且将其唤醒,其定义在头文件include/linux/kthread.h中. #define kthread_run(threadfn, data, ...

  3. linux tmpfs作用,linux ramfs和tmpfs区别及用法介绍

    ramfs是Linux下一种基于RAM做存储的文件系统.在使用过程中你就可以把ramfs理解为在普通的HDD上建立了一个文件系统,而现在HDD被替换成了RAM,因为是RAM做存储所以会有很高的存储效率 ...

  4. linux 获取内核线程数,如何从命令行获取Linux中的CPU /内核数量?

    前言: 基于/proc/cpuinfo的答案的问题是,它们parsing了供人类使用的信息,因此缺乏为机器分析devise的稳定格式 :输出格式可能因平台和运行时间条件而有所不同; 在Linux上使用 ...

  5. linux查看历史的所有命令,linux查询历史记录命令history的用法介绍

    一.什么是history在bash功能中,它能记忆使用过的命令,这个功能最大的好处就是可以查询曾经做过的举动! 从而可以知道你的运行步骤,那么就可以追踪你曾下达过的命令,以作为除错的工具! 二.His ...

  6. linux内核线程创建销毁机制

    这个话题乍一听貌似比较大,其实线程创建本身就是一件很平常的事情. 下面将要介绍的是,新版linux中创建内核线程的机制做了一些变化(其实本质没变,最终还是调用do_fork()来实现),和控制线程的时 ...

  7. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  8. 深入理解Linux内核之内核线程(上)

    1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 在linux系统中, 我们接触最多的莫过于 ...

  9. linux内核编程_内核线程kthread_run

    linux内核编程_内核线程kthread_run 1. 简述: 2. 使用示例: 3. 详述: 1. 简述: 头文件: include/linux/kthread.h 数据类型: struct ta ...

  10. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】

    转自:https://blog.csdn.net/gatieme/article/details/51589205 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...

最新文章

  1. 关于webservice的异步调用简单实例
  2. c语言遍历字符串数组的方法
  3. python微信红包代码_Python实现的微信红包提醒功能示例
  4. 每日一皮:我一般不担心警告,只担心错误...
  5. 活跃用户数怎么计算_留存率计算
  6. 当推荐系统遇见知识图谱会发生什么?
  7. 海量数据挖掘MMDS week6: 决策树Decision Trees
  8. 使用WPF设计类似Visio的简单绘图软件
  9. m3u8在线播放工具,在线播放地址
  10. thoughtworks面试总结
  11. vscode超好玩好用的插件
  12. android 动态磁贴,善用动态磁贴和Xbox游戏
  13. Java问题---扑克牌
  14. java-php-python-springboot网上摄影工作室计算机毕业设计
  15. 劳务派遣经营许可证怎样办理
  16. [转]金属加工工艺基础知识
  17. 如何从一名“普通码农”成长为技术Leader?
  18. 环球时报评出“影响新中国的60位外国人”
  19. 要知道喝水的14个惊人真相 - 生活至上,美容至尚!
  20. 顺丰快递代码表java_JAVA接入顺丰快递

热门文章

  1. centos启动提示unexpected inconsistency RUN fsck MANUALLY
  2. Bugtags 实时跟踪插件 - BugtagsInsta
  3. Nginx 笔记与总结(4)配置 server 访问日志
  4. python好东西啊
  5. [分享]Java 线程池的原理与实现
  6. 我对敏捷的理解:实施敏捷的前提
  7. Android SDK 和 JDK 安装
  8. EMNLP'21 | 学习改写非自回归机器翻译的翻译结果
  9. 颜宁追问4位男科学家:如何平衡事业和家庭?
  10. 《MYSQL必知必会》—18.如何使用MySQL的Match()和Against()函数进行全文本搜索以及查询扩展的使用