如何通过kill命令干掉内核线程?

如何通过kill命令干掉内核线程?如题。
我用kill -9 pid杀不掉,是不是内核线程命令有特别的?回复 #1 tbwises 的帖子以前内核是通过block所有的信号,现在是通过SIG_IGN忽略信号,即使是SIGKILL,SIGSTOP
所以发送一个SIGKILL到内核线程的后果和发送一个sig到忽略它的用户进程是类似的

内核线程是内核因需要而创建的,内核线程知道自己什么时候该做什么事情,甚至是exit,通常都不需要接受用户发信号没有错误信息么:em14:我认为内核线程无法杀死。回复 #3 vermouth 的帖子kill不会出错(当然,root),就像给用户态的忽略该信号的进程发了一个该信号,虽然没有任何动作,但是发送信号没有问题信号处理都在中断出口执行。其逻辑如下:

如果返回用户空间会处理信号,在do_notify_resume中完成,如果返回内核空间,不处理信号。内核线程永远都在内核中运行,不存在返回用户空间的可能,所以不可能接收到信号,更别说kill掉了。

不过需要注意的是:听说最近的内核对这部分处理有些变化,我没有来得及研究,大家自己去看看吧。

if(user_mode(regs)){
/*return to userpace*/

flags=atomic_get_thread_flags();
while(flags & _TIF_WORK_MASK){
if(flags & _TIF_NEED_RESCHED){
schedule();
flags=atomic_get_thread_flags();
continue;
}
do_notify_resume(syscall, 静华增瑞的博客flags,regs);
break;
}
}else{
/*return to kernelspace*/


[ 本帖最后由 camelguo 于 2008-6-22 20:25 编辑 ]原帖由 camelguo 于 2008-6-22 20:22 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
信号处理都在中断出口执行。其逻辑如下: 锐煜锐晨的博客

常见问题解答

r />如果返回用户空间会处理信号,在do_notify_resume中完成,如果返回内核空间,不处理信号。内核线程永远都在内核中运行,不存在返回用户空间的可能,所以不可能接收到 ...


内核线程也可以捕获信号,并不一定要像用户态那样执行信号处理函数

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

int just_printk(void *unused)
{
/*kernel thread ignore all signals by default */
allow_signal(SIGKILL);
while (1) {
if (kthread_should_stop()) {
printk("%s: stop me\n"www.pylsl.com,昱昱炎炎, __func__);
return 1;
}
else if (signal_pending(current)) {
/* XXX: add some code to see which sig
* had sent to me
*/
printk("%s: signal pending\n", __func__);
flush_signals(current);
}
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ/2);
}
}


static int __init sig_init(void)
{
struct task_struct *t = kthread_run(just_printk, NULL, "just_printk");

long start = jiffies;
#defineSECONDS 15
while (jiffies - start < HZ * SECONDS) {
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ/2);
}
kthread_stop(t);

return -1;
}

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("flw2");
module_init(sig_init);



最明显的要考虑用户态的请求的内核线程就是nfsd守护线程除非一个内核线程显式地调用了allow_signal,否则默认忽略一切信号。solaris里面内核线程无法被kill掉,因为你看不见:em30:

你可能感兴趣的:(如何通过kill命令干掉内核线程?)