解析问题
在写这个 Lab 的时候遇到了很多go语言读入文件后进行解析的问题,比如对 net/tcp 进行解析获取 inode ,又或者是对 pid/cmdline 的 \x00 分割进行解析,下面简单介绍一下如何
net/tcp
net/tcp 文件的主要形式是:

对于go语言来说,使用常规的 spilt 进行划分其实是不太可行的,这里的划分使用了类似制表符的方式,在 Lab 中我们的解决方式是
sl := strings.Fields(s)strings.Fields() 接受一个字符串参数,并且会返回一个字符串切片,这个函数会将原始字符串中的一个或者多个连续的空格进行切割,然后返回这个字符串切片
/proc/<pid>/status
status 是以人类可读的方式展示进程基本信息的文件,在 Lab 中我们主要是获取程序名称
status的主要形式是:
Name: systemd-userwor
Umask: 0022
State: S (sleeping)
Tgid: 12625
Ngid: 0
Pid: 12625
PPid: 70
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64
Groups:
NStgid: 12625
NSpid: 12625
......这里的处理方式与 tcp 中一致,我们只需要使用 strings.Field() 提取第一行的内容即可
cmdline
cmdline 会显示启动这个进程的启动命令,需要注意的是,这个文件中是以 \0x00 来划分参数的,所以我们可以用 spilt 进行切分后,使用for读出,当然也可以使用strings.ReplaceAll进行替换