红联linux Linux通用技术 - Linux发行版技术 - 企业应用 - 实验室  Linux论坛

您的位置: 红联linux >> Linux通用技术 >>

Linux编程与内核

>> 查看内容 -学Linux必读Linux学习教程推荐下载发新话题 (游客可发贴)

求帮忙看看下面的程序为什么在卸载模块时系统挂死,谢谢

ludehp发布于 2015-10-14 | 次阅读   字号:     (网友评论 1 条) 我要评论


下面这个简单的内核模块在加载和运行时都没有问题,但是卸载模块时,系统挂死了,不明白是什么原因,求大家解答一下,谢谢
CODE:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/err.h>
#include <linux/workqueue.h>
#include <linux/kthread.h>


struct my_work{
int idx;
struct work_struct work;
};


struct workqueue_struct *workqueue = NULL;
struct my_work work1={
.idx = 1,
};


struct task_struct *test_task1;


int thread_func(void *data);



void work_func(struct work_struct *work)
{
struct my_work *my_work;

if(work != NULL)
{
//my_work = container_of(work, struct my_work, work);
//printk("work form work%d\n",my_work->idx);
}
printk("working\n");
}


int thread_func(void *data)
{
data = data;


while(!kthread_should_stop())
{
set_current_state(TASK_UNINTERRUPTIBLE); //没有这句话为什么会一直打印,为什么不休眠??

printk("task add work!\n");

/*添加work到工作队列*/
queue_work(workqueue, &work1.work); //如果在上次的任务还没处理完,多次重复添加相同的work,只会执行一次

schedule_timeout(HZ);

if (signal_pending(current))
{
flush_signals(current);
}
}

return 0;
}

int create_thread(struct task_struct *task, void *arg)
{
int err;

task = kthread_create(thread_func, arg, "test_task");
if(IS_ERR(task))
{
printk("Unable to start kernel thread.\n");
err = PTR_ERR(task);
task = NULL;
return err;
}
/*唤醒任务*/
wake_up_process(task);

return 0;
}


static int __init mymodule_init(void)
{
int err;

workqueue = create_singlethread_workqueue("single_thread_workqueue");
if (NULL == workqueue)
{
return -ENOMEM;
}
INIT_WORK(&work1.work,work_func);

err = create_thread(test_task1,"task1");
if(err != 0 )
{
return err;
}

printk("My module worked!\n");

return 0;
}






static void __exit mymodule_exit(void)
{
printk("Unloadling my module.\n");

if(test_task1)
{

kthread_stop(test_task1);
test_task1 = NULL;
}

if (workqueue)
{
flush_workqueue(workqueue); //确保所有的工作都已经完成才释放资源
destroy_workqueue(workqueue);
}

printk("Unloaded my module.\n");
return;
}

module_init(mymodule_init);
module_exit(mymodule_exit);



MODULE_LICENSE("GPL");
MODULE_AUTHOR("test@163.com");
MODULE_DESCRIPTION("JUST FOR TEST!");


 相关评论
作者: ludehp 发布日期: 2015-10-14
解决了,犯了个低级错误
int create_thread(struct task_struct *task, void *arg)
函数应该是
int create_thread(struct task_struct **task, void *arg)

但是有一点还是不明白,如果去掉set_current_state(TASK_UNINTERRUPTIBLE)这一句,好像线程没法休眠,为什么会这样呢?
共有评论数 1/每页显示数 10

 我要评论
发表评论,与各位同人交流。回复请点击下方的我要评论按钮(游客可回复),要发表贴子请点击 发新话题 (游客可发贴)
 热点主题
·linux不可靠信号阻塞问题
·求助我在linux编程是遇到了
 最新主题
·求助我在linux编程是遇到了
·linux不可靠信号阻塞问题
 关注热点

Linux教程下载?
Linux学习教程推荐下载”(请点击),Linux教程免费下载。

求助Linux问题?
论坛有39版块,覆盖所有Linux技术层面。前往“红联Linux论坛

 

Linux系统教程 | Linux入门 | Linux管理 | Linux技巧 | Linux命令 | Ubuntu系统 | Linux服务器 | Linux数据库 | Linux开发

合作 | 关于我们 | 联系我们 | 导航 | 会员注册

©2017 红联 Powered by SupSite