AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 413052
Accepted
Bagus Trihatmaja
Bagus Trihatmaja
Asked: 2017-12-26 18:23:45 +0800 CST2017-12-26 18:23:45 +0800 CST 2017-12-26 18:23:45 +0800 CST

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

  • 772

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

但是,出于学习目的,我想使用低级系统调用,例如:open、、read和lseek。

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

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

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

  1. 我试图 grep 起始地址,逐个读取字符,直到找到-分隔符,然后lseek到行中的第一个字符并用于read获取起始地址。它在第一次迭代时工作正常,但在while((n = read(fd, buf, BUFSIZ)) > 0).

提取信息的最佳方法是什么?

c proc
  • 2 2 个回答
  • 4206 Views

2 个回答

  • Voted
  1. Best Answer
    G-Man Says 'Reinstate Monica'
    2017-12-26T19:59:04+08:002017-12-26T19:59:04+08:00
    • 是的,read(fd, buf, BUFSIZ)将从中读取BUFSIZ字节fd (除非您已经到达最后一个块,在这种情况下它将读取所有剩余的字节,其中的数量将被返回n并且将是 ≤ BUFSIZ)。如果你想一口气读取所有数据,你可以这样做
      wc /proc/ pid /maps
      看看它有多长(因此要制造多大BUFSIZ)。但这会适得其反。将整个文件读入内存很少必要甚至有用,而且您不能每次在不同的输入文件上运行程序时都更改程序中的参数。如果您想学习如何编写读取文件的程序,最好一次学习如何处理它们。
    • 你问题的第二部分没有多大意义。  grep? 您是在编写 C 程序还是 shell 脚本(或两者兼而有之)?
    • 阅读你想要的数据,把它扔掉,然后回去再读一遍是一个非常糟糕的习惯。将起始地址读取到-,然后lseek向后读取并再次读取它是荒谬的 -特别是如果您正在谈论将整个文件读入内存。如果您已将整个文件保存在内存中,那么您究竟为什么要再次读取其中的一部分呢?
    • 我建议使用fgets. 但是,如果您真的更喜欢使用read,请继续使用。您需要查找换行符 ( \n) 并识别行(fgets将为您执行此操作),然后从行中提取所需的信息。
    • 如果需要,您当然可以逐个字符地分析这些行。但我推荐sscanf。请务必检查返回值。
    • 1
  2. johnlinp
    2017-12-26T19:45:30+08:002017-12-26T19:45:30+08:00

    由于/proc/pid/maps是基于行的文件,使用read()读取文件有点麻烦。我建议使用getline()orfscanf()来达到这个目的。

    • 0

相关问题

  • 堆什么时候用于动态内存分配?

  • GNU make dep 究竟做了什么?

  • 用空格分割 /proc/pid/stat 的缺点是什么?

  • 基于 OpenCV 的程序优化嵌入式 linux OS [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve