简介

使用内核线程需要包含头文件#include <linux/kthread.h>,下面整理了一下常用的api接口,如下表格所示;

函数 功能
struct task_struct * kthread_create(threadfn, data, namefmt, arg...) 创建一个线程
struct task_struct * kthread_run(threadfn, data, namefmt, ...) 创建线程并运行
int kthread_stop(struct task_struct *k) 停止线程

例程

下面的代码简单实现了创建一个线程,循环60秒,每秒打印count的数值和传入线程执行函数的参数our_thread,所以预期结果是该模块会打印1 thread_func:thread1字符串的数据。

#include <linux/module.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/time.h> #include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/delay.h> static struct task_struct *thread_body;
static char our_thread[8]="thread1"; static int thread_func(void *buff) { static int count = 0;
char *data = (char*)buff;
unsigned long j0, j1;
int delay = 60*HZ; printk(KERN_INFO "In thread 1"); j0 = jiffies;
j1 = j0 + delay; while (time_before(jiffies, j1)){
schedule();
msleep(1000);
printk("%d thread_func:%s \n",++count,data);
} return 0;
} static int __init demo_thread_init(void){ printk(KERN_INFO "in demo_thread_init\n"); //这里可以也使用 kthread_run ,kthread_run中已经包含了wake_up_process操作
thread_body = kthread_create(thread_func, (char*)our_thread, "thread1"); if((thread_body))
{
wake_up_process(thread_body);
} return 0;
} module_init(demo_thread_init); static void __exit demo_thread_exit(void){
int ret;
ret = kthread_stop(thread_body);
if(!ret){
printk(KERN_INFO "Thread stopped\n");
}
}
module_exit(demo_thread_exit); MODULE_LICENSE("GPL");

运行结果

[    4.496344] 1 thread_func:thread1
[ 5.499766] 2 thread_func:thread1
...
[ 57.673065] 54 thread_func:thread1
[ 58.676418] 55 thread_func:thread1
[ 59.679734] 56 thread_func:thread1
[ 60.683070] 57 thread_func:thread1
...

参考

https://www.programering.com/a/MDN4IjMwATk.html

http://tuxthink.blogspot.com/2011/02/kernel-thread-creation-1.html

Linux内核驱动学习(五)KThread学习总结的更多相关文章

  1. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

    LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...

  2. LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)

    LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...

  3. linux内核分析第五周学习笔记

    linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  4. Linux内核分析第五周学习总结——分析system_call中断处理过程

    Linux内核分析第五周学习总结--分析system_call中断处理过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  5. Linux内核分析第五周学习总结

    扒开系统调用的三层皮(下) 20135237朱国庆+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  6. Linux内核分析第五周学习总结:扒开系统调用的三层皮(下)

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuO ...

  7. Linux内核分析——第五周学习笔记

    第五周 扒开系统调用的“三层皮”(下) 一.知识点总结 (一)给MenuOS增加time和time-asm命令 在实验楼中,首先 强制删除menu (rm menu -rf) 重新克隆一个新版本的me ...

  8. Linux内核设计第五周学习总结 分析system_call中断处理过程

    陈巧然原创作品 转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一 ...

  9. Linux内核驱动学习(八)GPIO驱动模拟输出PWM

    文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...

  10. linux内核驱动学习指南

    1. 参考链接 小白的博客 ONE_Tech 你为什么看不懂Linux内核驱动源码? 求教怎么学习linux内核驱动

随机推荐

  1. Application.Exit

    Application.Exit:通知winform消息循环退出.Environment.Exit:终止当前进程,返回exitcode给操作系统 Application.Exit会在所有前台线程退出后 ...

  2. C++常用注意事项

    new和delete:现在还没有new[][]和delete[][],所以在用这些的时候最好用循环解决,先一个指针的数组,然后再初始化,每个元素再new一下,这样就满足了多维数组的条件:比如: int ...

  3. L25词嵌入进阶GloVe模型

    词嵌入进阶 在"Word2Vec的实现"一节中,我们在小规模数据集上训练了一个 Word2Vec 词嵌入模型,并通过词向量的余弦相似度搜索近义词.虽然 Word2Vec 已经能够成 ...

  4. Python - 和我聊Python节目最新一期介绍 - 257期:使用超级电脑,Python,射电天文学知识来探索银河系

    今天,给大家简单介绍和我聊Python的最新一期节目,第257期:使用超级电脑,Python,射电天文学知识来探索银河系. 听着标题就觉得高大上,是的,我也是这么认为的.这次请的嘉宾来头很大,来自国际 ...

  5. 本地同时使用多个git账号

    config文件说明 Git Document指示在首次安装git的时候需要配置Config的相关内容信息,有三个地方存储了config文件,决定了读取的场景不同. 1 /etc/gitconfig: ...

  6. SSH proxycommand 不在同一局域网的机器ssh直连

    本地和192.168.1.10不在同一个网络,可以通过jumpserver跳转过去,操作如下 选项 -L 本机端口 -f 后台启用,可以在本机直接执行命令,无需另开新终端 -N 不打开远程shell, ...

  7. cli命令速查

    在文件的指定行(n)插入指定内容: sed -i "niecho "haha"" a 执行后,在a文件的第n行插入echo "haha" 多 ...

  8. synchronized 作为悲观锁,锁住了什么?

    继续来认识 synchronized,上篇文章加不加 synchronized 有什么区别?我们了解了 synchronized 是在多线程并发竞争同一资源的时候使用,这一篇我们来了解,synchro ...

  9. Apk优化极致

    1. webp WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器宽带资源和数据空间.Facebook Ebay等知 ...

  10. MYSQL隔离级别 与 锁

    1.四种隔离级别下数据不一致的情况   脏读 不可重复读 幻读 RU 是 是 是 RC(快照读) 否 是 是 RC(当前读) 否 否 是 RR(快照读) 否 否 是 RR(当前读) 否 否 否 Ser ...