使用了内核线程的内核模块不能卸载

发布于 2022-09-04 23:06:39 字数 879 浏览 18 评论 0

在内核模块中创建内核线程,内核线程执行完以后,使用rmmod卸载模块时,提示“已杀死”,然后使用lsmod查看,发现内核模块并没有被卸载,占用为-1。
但是如果在内核线程正在执行的情况下使用rmmod,就可以成功卸载这个模块。

下面是代码,内核线程的作用是每隔一秒printk一次。

struct task_struct *thr = NULL;

static int counting(void *data) {
    
    int i = 0;
    for(i=0; !kthread_should_stop() && i < 10; i++) {

        printk("i = %d\n",i);
        msleep(1000); /* delay 1 sec */
    }
    return 0;
}

static int __init print_init(void) {

    printk("kernel start !\n");

    thr = kthread_run(counting, NULL, "counting-thread");
    if(!thr) {
        printk("create kthread error ! \n");
        return -ECHILD;
    }
    return 0;
}

static void __exit print_exit(void) {

    if(!IS_ERR(thr)) {
        kthread_stop(thr);
    }
    printk("module exit! \n");
}

module_init(print_init);
module_exit(print_exit);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文