内核信息收集
进程之间的关系
1. 程序创建的进程具有父子关系。如果一个进程创建多个子进程时,则子进程之间具有兄弟关系。
进程描述符中引入一些字段表示进程之间的关系:
real_parent:指向创建当前进程的的进程,或者是当创建者已经消亡后,该指针指向init进程。
parent:指向当前父进程。通常和real_parent一样,只是当另外一个进程调用了ptrace()系统调用后,会改变。
children:当前进程创建的子进程链表的头节点
sibling: 指向下一个或上一个兄弟进程描述符
下图显示一组进程间的关系:进程P0创建了P1,P2,P3。进程P3创建进程P4。
2. 进程之间的非亲属关系的相关字段
group_leader:P所在进程组的领头进程的描述符指针
signal->pgrp:P所在进程组的领头进程的PID
tgid:P所在线程组的领头进程的PID
signal->session:P的登录会话领头进程的PID
ptrace_children:包含所有被跟踪的P进程的子进程的链表头
pstrace_list:所跟踪进程的实际父进程链表的前一个和下一个元素
3. pidhash表及其链表
很多情况下,内核必须能从进程PID导出对应的进程描述符。如linux的kill()系统调用需要从进程的PID导出
对应的进程描述符指针。为了加速此过程,引入了4个散列表,进程描述符有对应的4个字段,如下:
PIDTYPE_PID pid 进程的PID
PIDTYPE_TGID tgid 线程组领头进程的PID
PIDTYPE_PGID pgrp 进程组领头进程的PID
PIDTYPE_PID session 会话领头进程的PID
下图是PIDTYPE_TGID散列表的例子:
linux利用链表来处理PID冲突
4. 处理PID散列表的函数和宏
do_each_task_pid(nr, type, task)
while_each_task_pid(nr, type, task)
find_task_by_pid_type(type, nr)
find_task_by_pid(nr)
attch_pid(task, type, nr)
detach_pid(task, type)
next_thread(task)
阅读(2599) | 评论(0) | 转发(0) |