netstat
Mac 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 のものとは少し異なります。