对linux 0.11版本内核的kill系统调用的理解

来源:互联网 发布:百词斩和知米哪个好 编辑:程序博客网 时间:2024/05/05 01:31

      kill系统调用以前一直认为只是用来杀死某个进程的,看了源码纠正下自己的错误认识。源码如下:

int sys_kill(int pid,int sig){struct task_struct **p = NR_TASKS + task;int err, retval = 0;if (!pid) while (--p > &FIRST_TASK) {if (*p && (*p)->pgrp == current->pid) if (err=send_sig(sig,*p,1))retval = err;} else if (pid>0) while (--p > &FIRST_TASK) {if (*p && (*p)->pid == pid) if (err=send_sig(sig,*p,0))retval = err;} else if (pid == -1) while (--p > &FIRST_TASK)if (err = send_sig(sig,*p,0))retval = err;else while (--p > &FIRST_TASK)if (*p && (*p)->pgrp == -pid)if (err = send_sig(sig,*p,0))retval = err;return retval;}

分析:主要分成4个判断。
①pid为0,则向每一个进程组号为当前进程pid的进程发送该信号
②pid>0,向该进程号发送信号
③pid=-1,向除0号进程外的所有进程发送信号
④pid<-1,向进程组号为-pid的进程发送信号
另外在第一种情况里面调用的是send_sig(sig,*p,1),而其他调用的是send_sig(sig,*p,0)。再来挖一下参数0和1的区别,下面是send_sig()的函数源码:

static inline int send_sig(long sig,struct task_struct * p,int priv){if (!p || sig<1 || sig>32)return -EINVAL;if (priv || (current->euid==p->euid) || suser())p->signal |= (1<<(sig-1));elsereturn -EPERM;return 0;}

这种代码主要表述的是在什么情况下当前进程能向其他进程发送信号,有3中情况,满足任意一种即可。
①priv=1,这个变量代表强制发送信号的标志,当它为1时,则不需要考虑进程用户属性或级别,它都有权发送信号。结合到kill的代码里面,也就是说kill调用中的参数pid=0的时候才会强制发送信号
②当前进程的有效用户标识符就是指定进程的标识符,也就是说就是自己
③超级用户

0 0
原创粉丝点击