/proc/pid/maps
開始アドレス、終了アドレス、権限などの情報を抽出したいです。
open
ただし、学習目的で次read
のような低レベルのシステムコールを使用したいと思いますlseek
。
必要な情報を見つける方法は混乱しています。私はいくつかの課題があることを発見しました。
- を使用してファイル全体を読み取るには
read()
?
今は、 を使ってwhile((n = read(fd, buf, BUFSIZ)) > 0)
ファイルを読み込んでいますが、一括読み込み中なのでBUFSIZ
*2 を増やしても問題は解決されません。
-
開始アドレスを見つけるために区切り文字が見つかるまで文字を1つずつ読み、次に行の最初の文字を読み取り、lseek
それを使用してread
開始アドレスを取得しようとしています。最初の繰り返しではうまくいきましたがwhile((n = read(fd, buf, BUFSIZ)) > 0)
。
情報を抽出する最良の方法は何ですか?
答え1
- はい、ここでバイトを
read(fd, buf, BUFSIZ)
読み取ります(最後のブロックに達していない場合は、残りのバイトをすべて読みます。その数は返され、≤になります)。一度にすべてのデータを読み取るには:BUFSIZ
fd
n
BUFSIZ
トイレ/プロセス/PID/マップ
どのくらい長いかを確認してください(したがって、どれだけ大きくするかBUFSIZ
)。しかし、これは悪影響をもたらします。ファイル全体をメモリに読み込むことはほとんど必要ないし便利ではなく、他の入力ファイルで実行するたびにプログラムのパラメータを変更することはできません。ファイルを読み取るプログラムを書く方法を学びたい場合は、一度に1つずつ処理する方法を学ぶのが最善です。 - 質問の2番目の部分はあまり意味がありません。
grep
? Cプログラムやシェルスクリプト(またはその両方)を書いていますか? - 必要なデータを読み、捨てて、戻って再読み込むのは非常に悪い習慣です。開始アドレスを読む
-
、それからlseek
逆さまに読んで、もう一度読んでください。特にファイル全体をメモリに読み込むことについて話している場合。すでにメモリにファイル全体があるのに、なぜ一部を読み直すのですか? - 私はそれを使用することをお勧めします
fgets
。しかし、本当に使いたい場合は、引き続きread
使用してください。改行(\n
)文字を見つけてその行を識別し(fgets
この操作が自動的に実行される)、その行から必要な情報を抽出する必要があります。 - もちろん、必要に応じて行を文字ごとに分析することもできます。しかし、私はそれをお勧めします
sscanf
。戻り値を必ず確認してください。
答え2
/proc/pid/maps
行ベースのファイルなので、read()
ファイルを読むのはやや面倒です。getline()
この目的のためにorを使用することをお勧めします。fscanf()