解析问题

在写这个 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进行替换