关于进程树(pstree)的剖析

本文详细探讨了如何遍历Linux内核的进程树。作者在尝试使用进程的sibling链失败后,转向使用children链进行深度优先遍历。通过维护一个栈保存祖先节点,解决了回溯和避免重复遍历的问题。代码实现包括push、pop操作,并展示了如何通过任务结构体(task_struct)的children链来遍历和打印进程树。
摘要由CSDN通过智能技术生成

/*******************************************************************************************//*

代码及编写过程小结:

1.在使用sibling进程链时发现这个链有很严重的不可塑性,属于同一个父进程的所有子进程的sibling链都不相同,长短不一,而且链上的进程也毫无规律(至少我没找到)所以使用sibling链的结果就是只能打印部分进程,做不到遍历,于是放弃sibling

2.于是只剩下了children链可用,不过它的稳定性和一致性还是很让人放心的。但简单的数据结构就意味着要面临复杂的算法问题:

(a)在做深度优先遍历时,通过list_entry()做循环可寻找到叶子节点,但如何向根方向回溯却成了问题,我使用了一个栈来存放祖先节点(从根节点到该节点所经分支上的所有节点),拥有了祖先节点,用几个push,pop回溯和遍历看起来就不是问题了就不是问题了。

 (b)拥有了祖先节点,但却无法避免以某一祖先节点为选定节点进入另一树杈时却进入了原来已经扫过的树杈。这里想到两种解决方法,一是将已扫过树杈进行标记,但考虑到需要定义一个结构体,就犹豫了。于是有了第二种方法---在存放祖先节点的栈里并不存放祖先节点,而是存放(祖先节点)->next。至于这种方法的可行性,我用自己幼稚的框图法演绎了无数遍,给自己了一个肯定的答案。不知是不是创新O(∩_∩)O

 (c)剩下的就是一些细节问题了,比如递归的出口啊,判断条件啊什么的,应该做的还算规矩……

  (d)输出格式的缩进没有加在代码里,但是在我的结构里确实非常好做的,因为我保存了节点所处层次,就是祖先节点栈(其实是数组)里的序号i!相应的,i等于几,就缩进几个空格。

ps:除了没办法运行,我还是挺喜欢我的代码的

*//*******************************************************************************************/

 

 

#ifndef __KERNEL__

#define __KERNEL__

#endif

#ifndef MODULE

#define MODULE

#endif

#include <li

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值