杀不死进程怎么办(by liukun321咕唧咕唧)

做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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值