南京大学jyy os学习笔记
和软件分析课一起学,都是每天俩小时,突发奇想记录一下做实验的日常
实验
pstree
10.5
思考了如何保证输出的格式像标准的pstree一样。如下
1 | systemd─┬─ModemManager───2*[{ModemManager}] |
放弃直接开个超级大的二维字符串数组的想法,因为这样很浪费空间也可能会导致部分机器直接运行失败。
决定使用递归的方法,用栈记录每个有多个子进程的进程的位置,回溯的时候返回子树的最大高度,此返回值决定了要输出几个竖线|。分类讨论子进程的第一个和最后一个,用不同的符号作连接┬└。然后用strcat,sprintf等函数填到一个字符串数组里面,最后一起输出。子线程合为一行的之后再考虑,方法就是查找Tpid。先看看实现个雏形再说。
10.8
6号出去玩,7号打一天ctf,堂堂归来
想到了个更好的方法,还录制了个视频给朋友讲解了一下,说不定可行,开写
应该是可行的,微改一下就行了
10.10
9号回学校摆了。今日实现了一波感觉理论肯定是没问题的。
主要是第二层的进程的子进程的位置的规则还没编写好,明天把栈的规则再修改一下应该就行了
思路还是递归,也是记录有大于1个子进程的位置。不过这里是直接进行输出而不是像上面所说的用大字符数组存储。因为pstree输出的特征是能在一行表示的要么是一个父进程,其他全是他的子进程,要么是分隔线,┬└|这种。而它要是一行有多个分隔线,只有最右边的那个可能是┬└|三者中的一个,左边的全是|。所以递归到当前一行的时候取出栈中的值然后在对应的位置输出|,然后特判一下最后一个是┬└|中的哪个即可。其他全部填充空格,即可实现pstree的格式效果
目前思路是没问题的。
10.11
增增改改,还得优化一下递归的逻辑。递归已经能做到不同层输出到不同的位置,但是还是有一部分逻辑错误。
10.24
成都旅游加n1ctf加rust,一堆事后重回战场
完成了大部分工作,已经很接近正常的输出了
接下来需要解决的问题比较少了。
最后一位需要回溯,比如这里的├─update-notifier,应该是└─update-notifier,应该就是这里的问题,明天继续
11.15
非常的悲伤,中间由于突然的需求和手机邀请赛的准备,完全没时间接着写,整到今天才完事儿。不过学到很多东西,算了(
项目一拖太久了,有点小bug准备之后修,pstree就先到此为止