杀不死进程怎么办(by liukun321咕唧咕唧)
做linux开发的很多人都会遇到这个问题吧,上篇blog也提到过,原因主要有两个:一是进程已经成为僵死进程,当它的父进程将它回收或将它的父进程kill掉即可在ps输出看不到了;二是进程正处在内核状态中,Linux进程运行时分内核和用户两种状态,当进程进入内核状态后,会屏蔽所有信号,包括SIGKIL,所以这个时候kill -9也变得无效了。 下面就第二方面举个例子,进程处在内核态杀不
做linux开发的很多人都会遇到这个问题吧,上篇blog也提到过,原因主要有两个:
一是进程已经成为僵死进程,当它的父进程将它回收或将它的父进程kill掉即可在ps输出看不到了;
二是进程正处在内核状态中,Linux进程运行时分内核和用户两种状态,当进程进入内核状态后,会屏蔽所有信号,包括SIGKIL,所以这个时候kill -9也变得无效了。
下面就第二方面举个例子,进程处在内核态杀不死,多半是由于驱动程序有问题造成的,在阻塞型的驱动,是否用了正确的内核函数调用,或者结束休眠后是否做了恰当的处理?这都关系到是否可以通过信号杀死进程。
举个简单的例子:
while(dev->flag == 0)
{
up(&(dev->my_mutex));
wait_event_interruptible(dev->my_queue, dev->flag);
if(down_interruptible(&(dev->my_mutex)))
{
printk("There is a single break us to get the semaphore!\n");
}
}
上面这段代码 ,只要dev->flag == 0满足 ,这个进程就run forever了。
而进行如下修改后
while(dev->flag == 0)
{
up(&(dev->my_mutex));
ret = wait_event_interruptible(dev->my_queue, dev->flag);
if(ret)
{
return -ERESTARTSYS;
}
if(down_interruptible(&(dev->my_mutex)))
{
printk("There is a single break us to get the semaphore!\n");
}
}
则会被正常杀死
以上仅是一个最简单举例,说明一下由驱动造成的进程无法杀死的情况。
更多推荐
所有评论(0)