现在的位置: 首页 > 综合 > 正文

杀死内核线程

2013年10月16日 ⁄ 综合 ⁄ 共 1287字 ⁄ 字号 评论关闭

转载自:http://blog.csdn.net/lchjustc/article/details/6910999


注意事项:

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

(2)值得一提的是kthread_should_stop函数,我们需要在开启的线程中嵌入该函数并检查此函数的返回值,否则kthread_stop是不起作用的。

kthread_stop的调用----彻底杀死内核线程

 kthread_stop的定义如下:(内核源码:kernel/kthread.c)

int kthread_stop(struct task_struct *k)
{
	struct kthread *kthread;
	int ret;

	trace_sched_kthread_stop(k);
	get_task_struct(k);

	kthread = to_kthread(k);
	barrier(); /* it might have exited */
	if (k->vfork_done != NULL) {
		kthread->should_stop = 1;
		wake_up_process(k);
		wait_for_completion(&kthread->exited);
	}
	ret = k->exit_code;

	put_task_struct(k);
	trace_sched_kthread_stop_ret(ret);

	return ret;
}
EXPORT_SYMBOL(kthread_stop);

核心在于,kthread_stop会设置kthread结构提的should_stop标志为1,然后唤醒内核线程,

等待其结束,最后调用put_task_struct来释放内核线程的task_struct,此时彻底释放了内核线程

所占的系统资源。

有一点值得注意,那就是要想kthread_stop能够杀死正在执行的内核线程,则内核线程必须检测

kthread->should_stop标志位,如果被标记了就返回才可以。

所有的内核线程如果想彻底释放,必须外部调用kthread_stop才行,由于2号内核线程(内核线程的父亲)

的存在并且不处理信号,导致如果没有外界调用kthread_stop函数,则结束的内核线程将一直处于ZOMBIE状态。

驱动编写时这一点要小心在意!!一般说来,内核线程一旦启动就会跟随系统始终,除非模块被移除。所以这个特点

决定害处不大。

以上讨论的是通过系统调用kthread_create来创建的内核线程的创建和退出机制,

还有另外一种创建方式,就是kernel_thread调用来创建,二者的区别如下:


(1)最重要的不同:kthread_create创建的内核线程有干净的上下文环境,适合于驱动模块或用户空间的程序创建内核线程使用,不会把某些内核信息暴露给用户程序
(2)二者创建的进程的父进程不同: kthread_create创建的进程的父进程被指定为kthreadd, 而kernel_thread创建的进程可以是init或其他内核线程。

抱歉!评论已关闭.