2012-03-19 12 views
14

​​によると、1は、Linux上で、以下の情報にアクセスするために/procファイルシステムを使用することができます。Cのユーザスペースコードを使用してLinux/procインタフェースから読み込む最良の方法は何ですか?

/proc/[pid]/maps 
      A file containing the currently mapped memory regions and their access 
      permissions. 

      The format is: 

      address   perms offset dev inode pathname 
      08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 
      08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm 
      08058000-0805b000 rwxp 00000000 00:00 0 
      40000000-40013000 r-xp 00000000 03:0c 4165 /lib/ld-2.2.4.so 
      40013000-40015000 rw-p 00012000 03:0c 4165 /lib/ld-2.2.4.so 
      4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so 
      40135000-4013e000 rw-p 00115000 03:0c 45494 /lib/libc-2.2.4.so 
      4013e000-40142000 rw-p 00000000 00:00 0 
      bffff000-c0000000 rwxp 00000000 00:00 0 

      where "address" is the address space in the process that it occupies, 
      "perms" is a set of permissions: 

       r = read 
       w = write 
       x = execute 
       s = shared 
       p = private (copy on write) 

      "offset" is the offset into the file/whatever, "dev" is the device 
      (major:minor), and "inode" is the inode on that device. 0 indicates 
      that no inode is associated with the memory region, as the case would 
      be with BSS (uninitialized data). 

      Under Linux 2.0 there is no field giving pathname. 

を私は本当にC言語でのテキスト解析コードを書くことにしたくありません。むしろ、OSを呼び出すだけで、情報を構造体に直接読み込むことができます。私は/usr/include/linuxを見て、APIで明らかな構造があるかどうかを見ましたが、何も見えませんでした。

ので、2つのパートの質問:これは "悪い考え"

  1. を考慮することはできますか?つまり、カーネルインターフェースが変更された場合、ユーザプログラムがただちに文字列を噛んで、/procのテキストを読み込むべきですか?その場合は、Cを使用して/procから読むための「ベストプラクティス」が受け入れられていますか? (fscanf()?正規表現?)
  2. 私はこのデータを直接読み取ることができるカーネルインタフェース(存在すると仮定)のドキュメントを見つける方法はありますか? (カーネルソース自体は、起動するのに最適な場所ですか?あれば、カーネルソースのどこを調べるべきですか?)どのインタフェースが/proc/[pid]/mapsのデータを具体的に提供できるか分かっている場合は、 =)
+0

Busybox "top"は少なくとも/ procファイルを読み込んでスクリーンスクレイプします。ユーザーランドからは利用できないさまざまな情報があると思います。しかし、それは醜いです。 – blueshift

+0

は 'strtok'と' atoi'だけでまっすぐに見えます。'' \ n ''はレコード区切り文字で、' ''はフィールド区切り文字で、 'perms'は多分特殊ロジックを必要とします。 – bkconrad

+0

は、sscanfを使用する方が 'strtok'と' atoi'より高速です。 – Paschalis

答えて

8

私はperlやシェルスクリプトでは、/ proc/dataを読み込んで解析するのは問題ないと思います。 Cプログラムでは、堅牢性が必要な場合は、カーネル(恐らくsysctl)を使用します。

は、次のようにprocps-bundled pmap implementationは(one_proc()関数を参照してください)/proc/PID/mapsファイルライン・バイ・ラインを解析していることが判明:

sscanf(mapbuf,"%"KLF"x-%"KLF"x %31s %Lx %x:%x %Lu", &start, &end, flags, &file_offset, &dev_major, &dev_minor, &inode); 

EDIT:私の答えのオリジナルバージョンは、共有メモリ上のデータを解析する方法を示しました。 すべては、必要なOPとしてマッピングされたメモリセグメントではありません。

私はipcs -mが複数のプロセスに対して同じデータを提供すると信じています。だからあなたの2番目の質問への答えは、あなたがipcsコードを読む必要があることである。(例えばBSD versionLinux version):

+0

提案していただきありがとうございます。私はちょうど 'ipcs'を見ました、そして、それは私が望むことをしていないように見えますが、私はソースコードが正しい方向に私を導くことができるかどうか見てみましょう。 – mpontillo

+0

@Mike utilのlinux版のソースも見つかりました。答えに貼り付けたソースの抜粋では、必要なデータをクエリして解析する方法についての十分な情報が得られるはずです。 –

+0

このような重要なコードについては、投稿したスニペットにコードのライセンスステートメントを含めてください。 –

2

/proc/self/mapsのように順次テキストの擬似ファイルを読み込むには、その情報を取得するには、Linux上で、標準的な方法である(そしてそこそうでなければそれを得るのは簡単な方法ではなく、カーネルが与えている方法です)。

あなたのためにそれを行ういくつかのライブラリ(libprocのような)を使用することができます。しかし、最終的には、アプリケーションは/procの下のファイルを(おそらくいくつかのライブラリを通して)解析します。あなたがそれを避けるのが正しいかどうかはわかりません。

psまたはtopのようなコマンドを実行して、/procをアンマウントしてみます。それはおそらくもう働かないでしょう。

1

libprocは、/procの下でコンテンツにアクセスする便利な方法を提供します。

関連する問題