/proc/pid/maps を読むには read() を使用します。

/proc/pid/maps を読むには read() を使用します。

/proc/pid/maps開始アドレス、終了アドレス、権限などの情報を抽出したいです。

openただし、学習目的で次readのような低レベルのシステムコールを使用したいと思いますlseek

必要な情報を見つける方法は混乱しています。私はいくつかの課題があることを発見しました。

  1. を使用してファイル全体を読み取るにはread()

今は、 を使ってwhile((n = read(fd, buf, BUFSIZ)) > 0)ファイルを読み込んでいますが、一括読み込み中なのでBUFSIZ*2 を増やしても問題は解決されません。

  1. -開始アドレスを見つけるために区切り文字が見つかるまで文字を1つずつ読み、次に行の最初の文字を読み取り、lseekそれを使用してread開始アドレスを取得しようとしています。最初の繰り返しではうまくいきましたがwhile((n = read(fd, buf, BUFSIZ)) > 0)

情報を抽出する最良の方法は何ですか?

ベストアンサー1

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

おすすめ記事