如何通过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:
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Linux操作系统中,内核线程和用户线程之间的同步可以通过以下机制实现: 1. 信号量:内核线程可以通过信号量来通知用户线程进行某些操作。用户线程可以使用系统调用`semop`来操作信号量,内核线程可以使用`sem_post`来增加信号量的值,从而通知等待的用户线程;当信号量的值为0时,内核线程可以使用`sem_wait`等待用户线程对信号量进行操作。 2. 管道:管道是一种用于进程间通信的机制,内核线程可以通过管道向用户线程发送数据。用户线程可以使用`read`系统调用来读取管道中的数据,内核线程可以使用`write`系统调用向管道中写入数据,从而通知等待的用户线程。 3. 信号:内核线程可以向用户线程发送信号,通知其进行某些操作。用户线程可以使用`sigaction`系统调用来注册信号处理函数,内核线程可以使用`kill`系统调用向用户线程发送信号。 4. 等待队列:内核线程可以将用户线程加入等待队列,当某个条件满足时,内核线程可以唤醒等待队列中的用户线程。用户线程可以使用`wait_event`系统调用等待内核线程通知其进行某些操作,内核线程可以使用`wake_up`函数来唤醒等待队列中的用户线程。 总的来说,内核线程和用户线程之间的同步可以通过信号量、管道、信号和等待队列等机制来实现。不同的同步机制适用于不同的场景,应根据具体的应用需求来选择合适的机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值