做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");
  }
 }
 则会被正常杀死

以上仅是一个最简单举例,说明一下由驱动造成的进程无法杀死的情况。

Logo

更多推荐