我想从中提取信息/proc/pid/maps
,例如:起始地址、结束地址和权限。
但是,出于学习目的,我想使用低级系统调用,例如:open
、read
和lseek
。
我很困惑如何 grep 我需要的信息。我发现存在一些挑战:
- 如何使用读取整个文件
read()
?
现在,我正在使用while((n = read(fd, buf, BUFSIZ)) > 0)
, 来读取文件,但显然它是分批读取的,增加BUFSIZ
* 2 并不能解决问题。
- 我试图 grep 起始地址,逐个读取字符,直到找到
-
分隔符,然后lseek
读取行中的第一个字符并使用它read
来获取起始地址。它在第一次迭代中工作得很好,但在while((n = read(fd, buf, BUFSIZ)) > 0)
.
提取信息的最佳方法是什么?
答案1
- 是的,将从中
read(fd, buf, BUFSIZ)
读取BUFSIZ
字节fd
(除非您已到达最后一个块,在这种情况下它将读取所有剩余字节,其数量将被返回n
并且将≤BUFSIZ
)。如果你想一次性读取所有数据,你可以这样做厕所/过程/PID/地图
看看它有多长(以及因此要做多大BUFSIZ
)。但这会适得其反。将整个文件读入内存很少有必要,甚至没有用处,而且每次在不同的输入文件上运行程序时,您都不能到处更改程序中的参数。如果您想学习如何编写读取文件的程序,那么最好学习如何一次处理一个块。 - 你问题的第二部分没有多大意义。
grep
?您正在编写 C 程序或 shell 脚本(或两者)? - 读取你想要的数据,把它扔掉,然后返回并再次读取它是一个非常糟糕的习惯。读取起始地址到
-
,然后lseek
倒退再读一遍——尤其如果您正在谈论将整个文件读入内存。如果内存中已经有整个文件,为什么还要再次读取其中的一部分呢? - 我建议使用
fgets
.但是,如果您确实喜欢使用read
,请继续使用。您需要查找换行符 (\n
) 字符并识别这些行(fgets
将为您执行此操作),然后从这些行中提取所需的信息。 - 如果您愿意,您当然可以逐个字符地分析台词。但我推荐
sscanf
。请务必检查返回值。
答案2
由于/proc/pid/maps
是基于行的文件,使用read()
读取文件有点麻烦。我建议为此目的使用getline()
or 。fscanf()