如何在 rmmod 上停止 Linux 内核线程?

2024-01-25

我编写了以下代码来创建内核线程:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/kthread.h>
#include<linux/sched.h>

struct task_struct *task;
int data;
int ret;
int thread_function(void *data)
{
    int var;
    var = 10;
    return var;
}

static int kernel_init(void)
{
    data = 20;
    printk(KERN_INFO"--------------------------------------------");
    task = kthread_create(&thread_function,(void *)data,"pradeep");
    task = kthread_run(&thread_function,(void *)data,"pradeep");
    printk(KERN_INFO"Kernel Thread : %s\n",task->comm);
    return 0;
}

static void kernel_exit(void)
{
    ret = kthread_stop(task);
}

module_init(kernel_init);
module_exit(kernel_exit);

在发出 insmod 命令时,我能够创建一个名为“pradeep”的内核线程,并且我可以使用ps -ef命令如下

root      6071     2  0 10:21 ?        00:00:00 [pradeep]

它的父级是 kthreadd,PID 为 2。 但我无法阻止这个线程的给予rmmod命令。它给出以下输出:

ERROR: Removing 'pradeep': Device or resource busy.

有人可以告诉我如何杀死这个线程吗?


您应该只使用其中之一kthread_create() or kthread_run():

/**
 * 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;                                                               \
})

所以你正在创建two线程并泄漏其中之一:

task = kthread_create(&thread_function,(void*) &data,"pradeep");
task = kthread_run(&thread_function,(void*) &data,"pradeep");

此外,您的线程函数可能缺少一些细节:

/**
 * kthread_create - create a kthread.
 * @threadfn: the function to run until signal_pending(current).
 * @data: data ptr for @threadfn.
 * @namefmt: printf-style name for the thread.
 *
 * Description: This helper function creates and names a kernel
 * thread.  The thread will be stopped: use wake_up_process() to start
 * it.  See also kthread_run().
 *
 * When woken, the thread will run @threadfn() with @data as its
 * argument. @threadfn() can either call do_exit() directly if it is a
 * standalone thread for which noone will call kthread_stop(), or
 * return when 'kthread_should_stop()' is true (which means
 * kthread_stop() has been called).  The return value should be zero
 * or a negative error number; it will be passed to kthread_stop().
 *
 * Returns a task_struct or ERR_PTR(-ENOMEM).
 */

我认为终止线程的两种选择是:

  1. Call do_exit()当你完成时。
  2. 当另一个线程调用时返回一个值kthread_stop().

希望在解决这两个小问题之后,您将拥有一个功能性的线程创建器/收割器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 rmmod 上停止 Linux 内核线程? 的相关文章

随机推荐

  • GAE:如何获取斑点图像高度

    给出了 GAE 上的以下模型 avatar db BlobProperty 通过调用图像实例属性 height 或 width 查看文档 http code google com appengine docs python images i
  • 如何在 select2 插件中设置选择值 - jquery

    我使用此代码将数据插入到select元素与select2 plugin ajax type POST url ws asmx GetEvrakGrup data contentType application json charset ut
  • 从 varchar(max) 列中选择 XML

    我在 SQL Server 2005 上的 varchar max 列中存储了一些 XML 数据 数据采用以下形式 FQTN 完全限定类型名称
  • ConfigureWebHostDefaults 和ConfigureWebHost 方法之间有什么区别?

    我在通用主机构建器类上看到了 2 个几乎相同的扩展方法 HostBuilder ConfigureWebHostDefaults and ConfigureWebHost 它们具有相同的签名并位于不同的程序集中 我看见ConfigureWe
  • 如何通过 VBA 函数填充 Excel 工作表中的单元格?

    我只想通过 VBA 函数填充电子表格中的单元格 例如 我想在单元格中输入 FillHere 结果我将在一些单元格中填充一些数据 我尝试过这样的功能 Function FillHere Dim rngCaller As Range Set r
  • 如何在命令行上从 SVN 检出已删除的项目

    我正在尝试签出一个在版本 401 中从我的 SVN 中删除的项目 该项目现已失效 并已完全被代码重写所取代 但我想签出 以便我可以参考回来在重写时修改旧代码的小片段 据我所知 这应该像检查旧路径和最后一个好的修订版本 400 一样简单 但是
  • 如何关注WPF TabControl新添加的TabItem?

    我面临一个问题 我需要能够真正集中精力TabItem选项卡中的TabControl就像我会按TAB钥匙 我知道我可以使用SendKeys SendWait TAB 为了实现这一目标 但我更喜欢更强大的解决方案 选项卡项绑定到ItemSour
  • C 中的变量类型以及谁跟踪它

    我正在参加 MOOC 课程CS50 https www edx org course introduction computer science harvardx cs50x 来自哈佛大学 在第一堂课中 我们学习了不同数据类型的变量 int
  • iOS SecKeyRawVerify 返回-9809

    我用 openssl 创建了密钥对 openssl req x509 out public key der outform der new newkey rsa 1024 nodes keyout private key pem days
  • IE9 中的白屏问题 - 删除 iframe

    我想知道是否有人可以让我深入了解我一直在努力解决的一个非常奇怪的 IE9 问题 我正在完成一个工作网站的制作 它在 ff chrome ie7 ie8 中运行良好 没有脚本错误 在 IE9 上 应用程序的最后一步会导致整个选项卡变成白屏 并
  • Mac 上的 Sed 正则表达式问题,在 Linux 上工作正常

    这在 Linux Debian 上运行良好 sed e s t psd 在Mac上 我相信我必须使用 E标志 而不是 e sed E s t psd 但正则表达式不匹配 因此不会删除我想要的行 关于如何解决这个问题有什么建议吗 输入示例 a
  • 在Python中以编程方式创建变量[重复]

    这个问题在这里已经有答案了 可能的重复 如何以编程方式设置全局 模块 变量 https stackoverflow com questions 1429814 how to programmatically set a global mod
  • ASP.NET MVC4 中的 Ninject

    因此 经过一番折腾后 我终于将 Ninject 连接起来并在我的 MVC4 应用程序中进行编译 据我所知 我遇到的问题是 IDependencyScope 接口不再存在 并且 System Web Http Dependency 命名空间已
  • 计算圆与通过中心的直线的交点

    我如何获得直线和圆的交点 我有很多关于这个主题的信息 但我的要求不匹配 我得到了一条线 其一个端点位于圆的原点 而另一端位于圆之外的某处 现在我需要这条线和圆的交点 我尝试使用下面的公式从圆外找到最近的边缘点 但无法破解它 closestC
  • 检查 JavaScript setTimeout 是否已触发

    我希望能够通过 JavaScript 分派大量工作在浏览器中完成 从而使浏览器始终保持响应能力 我尝试采取的方法是将工作分块 将每个块传递给一个函数 然后用一个函数排队setTimeout func 0 call 我需要知道所有工作何时完成
  • 使用嵌入、对象或 iframe 方法更改 PDF 查看器中的背景颜色

    我一直在尝试不同的显示 PDF 的方法 目的是找到一种方法将灰色背景更改为白色 这是一个使用对象标签的简单示例 我使用嵌入和 iframe 标签得到相同的结果 http jsfiddle net 5CALy 7 http jsfiddle
  • 如何将 Flask/Peewee 与 Heroku 一起使用?

    我正在尝试部署一个Flask http flask pocoo org app to Heroku http www heroku com 我在用着Peewee http peewee readthedocs org en latest 作
  • “[HMR] 正在等待来自 WDS 的更新信号...”到底是什么意思 [重复]

    这个问题在这里已经有答案了 有谁知道它是什么 因为它相当烦人 而且我不希望它稍后在我的应用程序中引起问题 我正在使用 React 它在端口 5000 上运行 我正在使用 socket io 等制作一个在线聊天应用程序 Thanks 该消息适
  • RTP 视频流:是否必须存在 SDP 文件?

    我已经实现了原始 rtp 流 我想使用 VLC 或 Mplayer 来播放它 但视频播放器似乎无法播放此流 例如 MPlayer 说 Stream not seekable Stray packet seq 6 1013 seq 987 n
  • 如何在 rmmod 上停止 Linux 内核线程?

    我编写了以下代码来创建内核线程 include