对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
- 对linux 0.11版本内核的kill系统调用的理解
- 谈谈对linux系统调用的理解
- 对linux 0.11版本内核中的进程退出和回收的理解
- 对linux 0.11版本内核中进程创建fork()的理解
- 【转】linux内核编译与系统调用的添加(适合3.0及以后版本内核)
- linux内核编译与系统调用的添加(适合3.0及以后版本内核)
- 理解Linux的系统调用
- 对Linux内核映像架构的理解:
- 对linux内核宏container_of的理解
- 对linux内核宏container_of的理解
- 我对Linux和内核的理解
- 对Linux系统的理解以及学习Linux内核的心得
- 对linux 0.11版本中进程调度源码的理解
- 对linux 0.11版本中switch_to()的理解
- 对linux 0.11版本中do_signal()的理解
- Linux编写新的系统调用(内核版本3.2.18)
- 使用 Linux 系统调用的内核命令
- 使用 Linux 系统调用的内核命令
- 快速排序
- Linux嵌入式系统与硬件平台的关系
- JAVA系列学习书单
- 机房维修
- ocos2d-x 坐标系
- 对linux 0.11版本内核的kill系统调用的理解
- 记第五届ACM省赛总结—----没有努力,最终只能是悲剧
- POJ 2046 Gap(BFS+hash判重)
- C++中的vector使用范例
- django 登录与登出
- Java反射机制概念及构造方法的反射
- [Android]-图片JNI(C++)高斯模糊的实现与比较
- 交叉编译opencv
- centos 5 yum安装与配置vsFTPd FTP服务器