1

netstatMac OS X コンピューターで「got 4 を 2 回」のようなものが出力 される理由を理解しようとしています。

例えば:

$ netstat | head -15
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
[...]
tcp4       0      0  localhost.56892        localhost.26164        ESTABLISHED
got 4 twice
got 16 twice
got 1 twice
got 4 twice
got 4 twice
got 8 twice

メッセージは、netstat のinet.cprotoprによって、基本的に次のことを行う関数で出力されます。

  • sysctlbyname(3)PCB のリストを取得するためにeg を使用して呼び出しnet.inet.tcp.pcblist_nます (推測しますか?)
  • 結果をループし、さまざまな構造体へのポインターを収集します。xgn_kind
  • 見たそれぞれについてビットを設定しますxgn_kind。いずれかが 2 回表示されると、メッセージで不平を言います"got %d twice"

コードの関連部分を切り取りました。

void
protopr(uint32_t proto,   /* for sysctl version we pass proto # */
    char *name, int af)
{
  /* ... */

  if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) {
    if (errno != ENOENT)
      warn("sysctl: %s", mibvar);
    return;
  }

  /* ... */

  for (next = buf + ROUNDUP64(xig->xig_len);
       next < buf + len;
       next += ROUNDUP64(xgn->xgn_len))
  {
    /* ... */

    if ((which & xgn->xgn_kind) == 0) {
      which |= xgn->xgn_kind;
      /* ... */
    } else {
      printf("got %d twice\n", xgn->xgn_kind);
    }

    /* ... */
}

私の質問は、最後に:

なぜこうなった?から戻ってきたのは、誤ったデータsysctlですか? 上記のループは間違っていますか、つまり、sysctl実際には種類ごとに複数の構造体を返すことができますか?

私は Mac OS X を実行していることに注意してください。コードは実際、 FreeBSD のものとは少し異なります。

4

0 に答える 0