我想从中提取信息/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)
.
提取信息的最佳方法是什么?
read(fd, buf, BUFSIZ)
将从中读取BUFSIZ
字节fd
(除非您已经到达最后一个块,在这种情况下它将读取所有剩余的字节,其中的数量将被返回n
并且将是 ≤BUFSIZ
)。如果你想一口气读取所有数据,你可以这样做 看看它有多长(因此要制造多大BUFSIZ
)。但这会适得其反。将整个文件读入内存很少必要甚至有用,而且您不能每次在不同的输入文件上运行程序时都更改程序中的参数。如果您想学习如何编写读取文件的程序,最好一次学习如何处理它们。grep
? 您是在编写 C 程序还是 shell 脚本(或两者兼而有之)?-
,然后lseek
向后读取并再次读取它是荒谬的 -特别是如果您正在谈论将整个文件读入内存。如果您已将整个文件保存在内存中,那么您究竟为什么要再次读取其中的一部分呢?fgets
. 但是,如果您真的更喜欢使用read
,请继续使用。您需要查找换行符 (\n
) 并识别行(fgets
将为您执行此操作),然后从行中提取所需的信息。sscanf
。请务必检查返回值。由于
/proc/pid/maps
是基于行的文件,使用read()
读取文件有点麻烦。我建议使用getline()
orfscanf()
来达到这个目的。