使用 read() 读取 /proc/pid/maps

使用 read() 读取 /proc/pid/maps

我想从中提取信息/proc/pid/maps,例如:起始地址、结束地址和权限。

但是,出于学习目的,我想使用低级系统调用,例如:openreadlseek

我很困惑如何 grep 我需要的信息。我发现存在一些挑战:

  1. 如何使用读取整个文件read()

现在,我正在使用while((n = read(fd, buf, BUFSIZ)) > 0), 来读取文件,但显然它是分批读取的,增加BUFSIZ* 2 并不能解决问题。

  1. 我试图 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()

相关内容