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

      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));
	else
		return -EPERM;
	return 0;
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值