如何在内核中终止进程

最近在写一个简单的linux驱动程序,其中涉及到一个小知识点:如何在内核中终止进程。

具体一点就是在当驱动程序接收到特定的参数是,要将调用此模块的进程杀死(模拟崩溃情况),但在网上查找相关内容时几乎都是在说用kill命令杀死进程,(顺带在这里吐槽一下百度...),由于是在内核中杀死进程,当然就不能用kill命令了,自然也不能使用kill()了,但原理是相同的,先找到此进程的进程号,然后向其发送结束信号,将其结束掉,既然涉及到信号(signal)了,具体介绍附上网址:http://man7.org/linux/man-pages/man7/signal.7.html.这里简单介绍几种常用的信号类型:

  •  SIGINT  2

程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

  •  SIGKILL 9

用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。

  •  SIGTERM  15

程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。

由于要求我们安全的结束掉进程,所以这里我们使用了SIGTERM。

那么如何获取进程的进程号呢,多番查找资料后,发现每个进程都有一个变量current记录其相关的信息,其被定义在../include/asm/current.h中,要使用的话直接引用头文件就好,current是一个task_struct类型的全局变量,而task_struct被定义在../include/linux/sched.h中,源码地址https://github.com/torvalds/linux/blob/master/include/linux/sched.h

 

这里调用current->pid就可以获取到进程号了,那么知道了进程号之后我们又该如何杀死进程呢?

在这里我使用了kill_pid()函数,函数原型为

int kill_pid(struct pid *pid, int sig, int priv)

,其被声明在../include/linux/sched.h中,而被定义在../kernel/signal.c中,现在我们还却一个pid结构体指针变量,那么则要通过find_get_pid()获取,其被定义在../include/linux/pid.h中,具体形式为

struct pid *find_get_pid(int nr)

,万事具备,我们只需要组合一下即可将调用当前模块的进程终止掉了:

 

kill_pid(find_get_pid(current->pid), SIGTERM, 1)

目的达成~

其他方法暂时还有尝试,感觉sys_kill应该也可以达到相应的目的,但一直不太懂怎么用,求大神指导...

(https://elixir.bootlin.com/linux/latest/source这个网址似乎很好用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值