文章正文
linux之kill探究
好久没写东西了,抓住1月的尾巴,补上一篇,开发中常用kill命令杀死进程,具体为什么能杀死,我一直很好奇。前两天研究LMK的时候发现,在内存不够的时候使用了SIGKILL信号杀死了选定的进程,后面想着顺带探究了一下。
想要真正理解kill为什么能杀掉进程,需要理解linux上进程的工作原理,当然这里不可能说很清楚,我也没有这个能力,现在把我知道的写出来。
kill在linux中是一个程序,这个程序用于发送信号,linux中的信号很多,通过kill -l命令可以看
对于信号的处理可以参看下面的文章:
http://lifeofzjs.com/blog/2015/03/22/what-happens-when-you-kill-a-process/
这篇文章写的还是挺清楚的,
这里我们主要看一下9号信号,也就是传说中的强杀。与其他信号一样,在系统发送kill -9的信号终归走到内核中的signal.c文件的complete_signal函数中,通过sigaddset函数将对应进程或线程的pending.signal置为SIGKILL,调用signal_wake_up会将对应进程或线程唤醒
sinal_wake_up函数是一个内联函数,定义如下:
Include/linux/Sched.h 2682 static inline void signal_wake_up(struct task_struct *t, bool resume) 2683 { 2684 signal_wake_up_state(t, resume ? TASK_WAKEKILL : 0); 2685 }
最后在signal_wake_up_state函数中调用kick_process(schd/core.c)函数将任务去除(任务是linux内核中通常的叫法,在linux内核中,进程和线程区别不大)。下面我们再看一段log
>>>Cat /proc/kmsg <7>[ 248.646057s][pid:0,cpu0,in irq]nihao:complete_signal 32 <7>[ 248.646209s][pid:6556,cpu0,POSIX timer 60]nihao:complete_signal 32 <7>[ 248.686981s][pid:0,cpu3,in irq]nihao:complete_signal 32 <7>[ 255.298553s][2016:01:29 12:37:09][pid:6365,cpu1,sh]nihao:complete_signal 9 <7>[ 255.487976s][pid:6490,cpu3,Monitor Hanlder]nihao:complete_signal 17 <7>[ 255.488311s][pid:3175,cpu0,main]nihao:do_signal 17 <7>[ 255.488311s][pid:3175,cpu0,main]nihao:handle_signal 17 <7>[ 255.630401s][pid:0,cpu7,in irq]nihao:complete_signal 32
通过log可以看到在杀死一个进程的时候,会向父进程发送编号17的信号,通过上面可以看到这个信号SIGCHLD,就是用于通知父进程子进程结束的信号,对于被杀的进程的子进程会有新的父进程,这已经是进程调度的内容了,这里不再叙述。
好了,就写到这里了,这个里面我也有一些没理解,例如:kick_process是怎么将任务去除的?后面理解了再补上。
Jan. 31, 2016, 8:22 p.m. 作者:zachary 分类:Linux相关 阅读(1906) 评论(0)