关于kthread_stop的疑问(linux3.16)

线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。

之前找销毁内核线程的接口时,发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程。

最开始以为对于一个已经唤醒的内核线程,我们直接调用这个接口就能够让这个线程自动退出。后面经过试验发现并不是这样的======》kthread_stop只是通知线程退出,至于线程是否会退出,取决于线程的行为,即是否有kthread_should_stop动作,去检查,去主动退出

测试代码1

static struct task_struct *test_task;
struct task_struct *task;
struct timer_list timer;
int test_thread(void* a)
{printk(KERN_EMERG "\r\n thread start\n");
#ifdef CONFIG_PREEMPT_COUNTprintk(KERN_EMERG "\r\n CONFIG_PREEMPT_COUNT\n");
#elseprintk(KERN_EMERG "\r\n not define CONFIG_PREEMPT_COUNT\n");
#endif	while (1){if( kthread_should_stop()){printk(KERN_EMERG "\r\n exit while\n");break;}msleep(10000);	}printk(KERN_EMERG "\r\n thread end\n");return 0;
}
int kill_thread(void* a)
{if (NULL != test_task){printk(KERN_EMERG "\r\n attempt kill test_thread\n");kthread_stop(test_task);printk(KERN_EMERG "\r\n kill test_thread complete\n");}return;
}
void timer_work(unsigned long data)
{wake_up_process(task);return;
}static int smsc911x_init(struct net_device *dev)
{
................	timer.expires=jiffies+msecs_to_jiffies(20000);timer.function=timer_work;init_timer(&timer);add_timer(&timer);printk(KERN_EMERG "\r\n create thread\n");//spin_lock(&lockdep_test);test_task = kthread_create(test_thread, NULL, "test_task");wake_up_process(test_task); task = kthread_create(kill_thread, NULL, "kill_task");//kthread_stop(test_task);printk(KERN_EMERG "\r\n create thread end\n");
.....................
}

log如下:可以看到在上面的代码样例中(kthread_should_stop必须要有这个),确实能够让内核线程退出

测试代码2 

将内核线程的处理函数里面的kthread_should_stop去掉,其他保持不变。看看会发生什么

int test_thread(void* a)
{printk(KERN_EMERG "\r\n thread start\n");
#ifdef CONFIG_PREEMPT_COUNTprintk(KERN_EMERG "\r\n CONFIG_PREEMPT_COUNT\n");
#elseprintk(KERN_EMERG "\r\n not define CONFIG_PREEMPT_COUNT\n");
#endif	while (1){/*if( kthread_should_stop()){printk(KERN_EMERG "\r\n exit while\n");break;}*/msleep(10000);	}printk(KERN_EMERG "\r\n thread end\n");return 0;
}

log如下:可以看到。如果处理函数里面没有kthread_should_stop,即使通过kthread_stop通知内核线程应该退出了,但是内核线程不去检查是否应该退出,那么内核线程也是无法退出的。即kthread_stop是无法强制杀死内核线程的

测试 代码3

内核线程处理函数不要kthread_should_stop,在内核线程刚被创建并唤醒的时候,调用kthread_stop通知其退出。按照测试代码2,它应该不会主动退出的。但是实测这样是可以让内核线程退出的(甚至内核线程都没有被调度),这里没有想明白

static struct task_struct *test_task;
int test_thread(void* a)
{printk(KERN_EMERG "\r\n thread start\n");
#ifdef CONFIG_PREEMPT_COUNTprintk(KERN_EMERG "\r\n CONFIG_PREEMPT_COUNT\n");
#elseprintk(KERN_EMERG "\r\n not define CONFIG_PREEMPT_COUNT\n");
#endif	while (1){/*if( kthread_should_stop()){printk(KERN_EMERG "\r\n exit while\n");break;}*/msleep(10000);	}printk(KERN_EMERG "\r\n thread end\n");return 0;
}static int smsc911x_init(struct net_device *dev)
{
........................	/*timer.expires=jiffies+msecs_to_jiffies(20000);timer.function=timer_work;init_timer(&timer);add_timer(&timer);*/printk(KERN_EMERG "\r\n create thread\n");//spin_lock(&lockdep_test);test_task = kthread_create(test_thread, NULL, "test_task");wake_up_process(test_task); //task = kthread_create(kill_thread, NULL, "kill_task");kthread_stop(test_task);printk(KERN_EMERG "\r\n create thread end\n");
......................................
}

log如下:可以看到内核线程打印的thread start,并且也搜到对应的内核线程

后面有时间研究一下这个是为什么

 使用注意事项

1、在执行kthread_stop的时候,目标线程必须没有退出,否则会Oops。原因很容易理解,当目标线程退出的时候,其对应的task结构也变得无效,kthread_stop引用该无效task结构就会出错。

2、内核线程的处理函数里面需要有kthread_should_stop,用于检查是否应该主动退出,否则线程是不会主动退出的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 的引导与服务控制

一 开机启动过程 bios加电自检-->mbr-->grub-->加载内核文件-->启动第一个进程 1 bios加电自检 检测硬件是否正常,然后根据bios中的启动项设置,去找内核文件 2 mbr 因为grup太大,第一个扇区存不下所有的grub程序,所以分为…

Edge浏览器开启/关闭侧栏和找回CopilotBing按钮

文章目录 Edge浏览器开启/关闭侧栏找回Copilot&Bing按钮(正常使用其功能需要能够访问外网) Edge浏览器开启/关闭侧栏 打开Edge浏览器,通过快捷键 Ctrl Shift / 来开启/关闭侧栏。 找回Copilot&Bing按钮(正常使用其功能…

【Tools】VS基本使用

文章目录 0 前言1 下载安装与基本使用1.1 下载安装1.2 项目创建1.3 编译运行和调试1.4 界面和设置 2 项目属性配置【重点】2.1 打开项目属性配置窗口2.2 静态库和动态库2.3 包含目录&库目录&依赖项&工作目录2.4 代码中添加附加依赖项2.5 配置项目环境变量2.6 修改属…

护眼台灯是智商税吗?眼科医生告诉你哪款护眼台灯最好

青少年近视发病率高达67%,如今,人们都被屏幕包围着,电脑、手机和电视已经成为最重要的信息手段,我们周围的屏幕也隐藏着有害的光污染。 对于4-15岁年龄段的孩子而言,除了学习本身带来的视力损伤外,每天接触…

Linux编写SH脚本启动单个jar应用

目录 一、启动脚本第一步:创建一个脚本文件第二步:把下面代码复制到脚本中第三步:给脚本授权 二、停止脚本第一步:创建一个脚本文件第二步:把下面代码复制到脚本中第三步:给脚本授权 结尾 一、启动脚本 第一…

Trino:分区表上的SQL提交 查询流程浅析

Trino SQL执行过程的关键特性 Client、Coordinator、Worker之间的通讯,基于HTTP协议。SQL提交、解析、调度、执行等的流程全异步,最大化运行效率。逻辑计划树被在Coordinator侧被拆分成PlanFragment,可以对应于Spark中的Stage概念&#xff0…

C语言学习NO.12-字符函数(二)-strcpy,strcat,strcmp长度不受限制的字符串函数

一、strcpy的使用和模拟实现 &#xff08;一&#xff09;strcpy使用 //strcpy的使用 #include <stdio.h>int main() {char arr1[] "abcdef";char arr2[10] "qwertt";char arr3[10] "okl";strcpy(arr2, arr1);printf("arr2 %s\n&…

iOS 解决push证书不受信任

重新下载&#xff1a;https://www.apple.com/certificateauthority/

【华为OD真题 Python】贪吃的猴子

文章目录 题目描述输入输出示例1输入输出说明示例2输入输出说明示例3输入输出说明备注实现代码题目描述 一只贪吃的猴子,来到一个果园,发现许

leetcode:2784. 检查数组是否是好的(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums &#xff0c;如果它是数组 base[n] 的一个排列&#xff0c;我们称它是个 好 数组。 base[n] [1, 2, ..., n - 1, n, n] &#xff08;换句话说&#xff0c;它是一个长度为 n 1 且包含 1 到 n - 1 恰好各一次&#xff0c;包含 n 两…

Java反射篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、反射使用步骤(获取 Class 对象、调用对象方法)二、获取 Class 对象有几种方法三、利用反射动态创建对象实例前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

Rust:qmetaobject 框架的环境变量和搜索路径设置

一、编译错误 安装qmetaobject后&#xff0c;编译出现下面错误信息&#xff0c;原因是环境变量和搜索路径没有正确设置。 qt_gui>cargo run warning: unused manifest key: buildCompiling qttypes v0.2.11 error: failed to run custom build command for qttypes v0.2.1…

Java集合-LinkedList

Java集合-LinkedList 特性 public class LinkedList<E> extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable1、继承于 AbstractSequentialList &#xff0c;本质上面与继承 AbstractList 没有什么区别…

六、书写命令

目录 一、显示命令 二、命令执行 三、命令出错 四、嵌套执行 make 五、定义命令包 每条规则中的命令和操作系统 Shell 的命令行是一致的。make 会一按顺序一条一条的 执行命令&#xff0c;每条命令的开头必须以[Tab]键开头&#xff0c;除非&#xff0c;命令是紧跟在依赖规…

Handler

我们知道&#xff0c;android是不允许在子线程中更新ui的&#xff0c;但是为了避免anr&#xff0c;我们有时候不得不在子线程中去执行一些耗时操作&#xff0c;然后根据这些耗时操作的执行结果来更新ui界面。对于这种情况&#xff0c;android提供了一套异步消息处理机制。 异步…

【MYSQL】MYSQL 的学习教程(十一)之 MySQL 不同隔离级别,都使用了哪些锁

聊聊不同隔离级别下&#xff0c;都会使用哪些锁&#xff1f; 1. MySQL 锁机制 对于 MySQL 来说&#xff0c;如果只支持串行访问的话&#xff0c;那么其效率会非常低。因此&#xff0c;为了提高数据库的运行效率&#xff0c;MySQL 需要支持并发访问。而在并发访问的情况下&…

【GO】如何用 Golang 的 os/exec 执行 pipe 替换文件

背景 主要记录一下怎么用 Golang 的 os/exec 去执行一个 cmd 的 pipeline&#xff0c;就是拿 cmdA 的输出作为 cmdB 的输入&#xff0c;这里记录了两种方法去替换文件里面的字符串。 pipe 那个逻辑在 demo1 里。 另外一种是直接读文件做替换&#xff0c;一不小心两个都放进来了…

[密码学][ecc]secp256k1

secp256k1 is the elliptic curve used in Bitcoin’s public key cryptography. It is defined by the equation y^2 x^3 7 and is based on the finite field mathematics. The “secp” in secp256k1 stands for “Standards for Efficient Cryptography” and “256” re…

CharRNN实现简单的文本生成

文本数字表示 统计文档中的字符,并且统计字符个数。这里是为了将文字转换为数字表示。 import numpy as np import re import torch class TextConverter(object):def __init__(self,text_path,max_vocab=5000):"""建立一个字符索引转换,主要还是为了生成一个…

【IPC通信--信号】

信号处理函数 • 信号发送函数 – kill(), sigqueue(), raise(), alarm(), setitimer(), pause() &#xff0c; abort() • 信号安装函数 – signal(), sigaction() • 信号集操作函数 – sigemptyset(), sigfillset(), sigaddset(), sigdelset(), sigismember() 信号发送函数—…