/procでTCP接続リストを読む

/procでTCP接続リストを読む

各プロセスの既存のTCP接続をすべて列挙するコード(同様)を実装しようとしていますnetstat -lptn。私はそれに頼るのではなく、直接実装することを好みますnetstat。このために/proc/<PID>/net/tcp

以下にリストされている多くのTCP接続が表示されますが、/proc/<PID>/net/tcpコマンドを介しては表示されませんnetstat -lptn

/proc/1/net/tcpたとえば、いくつかのTCP接続でこれを見ました/proc/2/net/tcp(Ubuntu 16で試しました)。私が理解したところ、これはTCP接続があってはならないプロセスに関連しています/proc/1/net/tcp。また、/sbin/initそれに関連するTCP接続もあってはなりません/proc/2/net/tcpkthreadd

ベストアンサー1

あなたのアプローチについて多くの誤解があります。一つずつ検討します。

  1. ソケットは特定のプロセスに関連付けられません。ソケットが作成されると、参照数は1です。ただし、別の方法(ファイル記述子を渡すdup2などfork)を使用して同じソケットへの参照を多数作成して、参照数を増やすことができます。これらの参照のいくつかは、多くのスレッドで利用可能な開かれたファイル記述子テーブルから入手できます。これらのスレッドは同じスレッドグループ(PID)に属することも、別のスレッドグループに属することもできます。この-pフラグを使用すると、netstat各プロセスにアクセスできるソケットを列挙し、既知の各ソケットのプロセスを見つけようとします。候補プロセスが複数ある場合、関心のあるプロセスが表示されるという保証はありません。
  2. /proc/<PID>/net/tcpこのプロセスに関連するソケットだけがリストされているわけではありません。プロセスが属するネットワーク名前空間のすべてのTCPv4ソケットを一覧表示します。デフォルト設定では、システム内のすべてのプロセスが単一のネットワーク名前空間に属するため、すべてのPIDに対して同じ結果が表示されます。また、ネットワークを使用していないスレッド/プロセスがこのファイルにコンテンツを持っている理由も説明します。ネットワーク自体を使用しなくても、他のプロセスはネットワークを使用できるネットワーク名前空間に属します。
  3. /proc/<PID>/net/tcpリスニングと接続ソケットが含まれています。-lこれを渡すと、リスニングソケットnetstatのみが表示されます。出力をより密接に一致させるには、-a代わりにが必要です-l
  4. /proc/<PID>/net/tcpTCPv4ソケットのみを含みます。/proc/<PID>/net/tcp6また、すべてのTCPソケットを表示するにはそれを使用する必要があります。

自分のプロセスと同じ名前空間にあるソケットにのみ興味がある場合は、他のPIDを繰り返す必要はありません。 yes/proc/net/tcp以降、代わりにシンボリックリンクを使用できます。/proc/net/tcp6/proc/net/proc/self/net

おすすめ記事