D状态(disk sleep)进程用kill -9命令是不管用的,最简单的方法就是reboot, 除此还可以修改内核,将其进程状态转化为别的状态,然后kill掉。
新建文件夹, cd进去,新建killd.c 文件,代码如下:

#include <linux/init.h> 
#include <linux/kernel.h> /*Needed by all modules*/
#include <linux/module.h>
#include <linux/sched.h> //for_each_process
MODULE_LICENSE("BSD");
static int pid = -1;
module_param(pid, int, S_IRUGO);
static int killd_init(void)
{
struct task_struct * p;
printk(KERN_ALERT "killd: force D status process to death/n");
printk(KERN_ALERT "killd: pid=%d/n", pid);
//read_lock(&tasklist_lock);
for_each_process(p){
if(p->pid == pid){
printk("killd: found/n");
set_task_state(p, TASK_STOPPED);
printk(KERN_ALERT "killd: aha, dead already/n");
return 0;
}
}
printk("not found");
//read_unlock(&tasklist_lock);
return 0;
}
static void killd_exit(void)
{
printk(KERN_ALERT "killd: bye/n");
}
module_init(killd_init);
module_exit(killd_exit);

然后新建Makefile文件:

obj-m := killd.o 
all :
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

然后执行make命令进行编译;

make

再执行如下命令:

sudo insmod ./hello.ko #加载
sudo rmmod hello #删除 或者 sudo rmmod ./hello.ko

插入模块的时候提供D状态的进程号,就可以将其转换为t状态,使用普通kill就可以杀死。

sudo insmod ./killd.ko pid=1234

参考资料:
http://blog.csdn.net/bytxl/article/details/41749063
http://www.it165.net/os/html/201403/7540.html

更多相关文章

  1. linux进程和线程排查 · 记一次JVM CPU高负载的排查办法
  2. linux c (4) 进程终止-exit和_exit函数
  3. Linux进程通信[2]-互斥锁和条件变量
  4. Linux网络状态工具ss命令使用详解
  5. linux 创建子进程
  6. linux c 多进程socket程序,如何实现父进程监听,子进程接受连接(注
  7. 边学边干Linux内核指导(8)——进程调度
  8. Linux下的进程间通信
  9. 在linux上获取已连接电视的电源状态

随机推荐

  1. 第十七章 Android 常见的Service
  2. 全家桶!阿里P8大佬熬夜15天,把所有Android
  3. Tensorflow在手机端的部署——官网Androi
  4. android SQLite存储简单范例+详细注释(增
  5. Android ImageView 图片等比缩放问题
  6. Google Docs 更新,提供 Honeycomb 平板更
  7. 《疯狂Android讲义》
  8. Android学习系列(39)--Android主题和样式
  9. Android UI Action Bar之ActionBarSherlo
  10. 社区讨论:Android的架构设计