C

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

  • December 26, 2017

我想從中提取資訊/proc/pid/maps,例如:起始地址、結束地址和權限。

但是,出於學習目的,我想使用低級系統呼叫,例如:open、、readlseek

我很困惑如何 grep 我需要的資訊。我發現了一些挑戰:

  1. 如何使用讀取整個文件read()

現在,我正在使用while((n = read(fd, buf, BUFSIZ)) > 0), 來讀取文件,但顯然它是分批讀取,增加BUFSIZ* 2,並不能解決問題。

  1. 我試圖 grep 起始地址,逐個讀取字元,直到找到-分隔符,然後lseek到行中的第一個字元並用於read獲取起始地址。它在第一次迭代時工作正常,但在while((n = read(fd, buf, BUFSIZ)) > 0).

提取資訊的最佳方法是什麼?

  • 是的,read(fd, buf, BUFSIZ)將從中讀取BUFSIZ字節fd (除非您已經到達最後一個塊,在這種情況下它將讀取所有剩餘的字節,其中的數量將被返回n並且將是 ≤ BUFSIZ)。如果你想一口氣讀取所有數​​據,你可以這樣做
wc /proc/ *pid* /maps

看看它有多長(因此要製造多大BUFSIZ)。但這會適得其反。將整個文件讀入記憶體很少必要甚至有用,而且您不能每次在不同的輸入文件上執行程序時都更改程序中的參數。如果您想學習如何編寫讀取文件的程序,最好一次學習如何處理它們。

  • 你問題的第二部分沒有多大意義。  grep? 您是在編寫 C 程序還是 shell 腳本(或兩者兼而有之)?
  • 閱讀你想要的數據,把它扔掉,然後回去再讀一遍是一個非常糟糕的習慣。將起始地址讀取到**-**,然後lseek向後讀取並再次讀取它是荒謬的 -特別是如果您正在談論將整個文件讀入記憶體。如果您已將整個文件保存在記憶體中,那麼您究竟為什麼要再次讀取其中的一部分呢?
  • 我建議使用fgets. 但是,如果您真的更喜歡使用read,請繼續使用。您需要查找換行符 ( \n) 並辨識行(fgets將為您執行此操作),然後從行中提取所需的資訊。
  • 如果需要,您當然可以逐個字元地分析這些行。但我推薦sscanf。請務必檢查返回值。

引用自:https://unix.stackexchange.com/questions/413052