Linuxプログラミングインタフェースは次のように言います。
56.5.5 接続終了: close()
ストリームソケット接続を終了する一般的な方法は、close()を呼び出すことです。もし複数のファイル記述子が同じソケットを参照します。、接続が終了しますすべての記述子閉じた。
カーネルはソケットにどのデータ構造を使用しますか?通常のファイルに似ていますか?
- ファイル記述子テーブル
- ファイル記述テーブル
- 仮想ノードテーブル?
「複数のファイル記述子が同じソケットを参照します」とは、「複数のファイル記述子が同じソケット記述を参照します」と同じ意味ですか?
「同じソケットを参照する複数のファイル記述子」はどのように生成されますか?dup()
ソケット固有の機能によって生成されますか?
以前はソケットの2つの異なる定義を見たことがあります。
ソケットはポート(TCPポート、UDPポート)と同じです。
TCPソケットは接続によって識別されるため、複数のソケットが同じTCPポートに対応する可能性があります。 (これはソケットAPIで使用される定義のようです)
「複数のファイル記述子が同じソケットを参照します」の参照で使用されるソケット定義は何ですか?
答え1
簡単な答えは、ファイル記述子が実際のソケットへの参照にすぎないことを覚えておくことです。同じソケットを参照する複数のファイル記述子がある可能性があります。参照カウントは、最後の参照が削除されたときにソケットを終了するために使用されます。
はい。dup(2)
ソケットファイル記述子を使用できます。
より長い説明は、ファイル記述子がカーネルinodeへのユーザースペースハンドルにすぎないことです。カーネルには、より高いレベルの汎用ソケットインタフェースであるカーネルへのstruct inode
ポインタがあります。この構造には、実際のTCP / IPソケットであるstruct socket
下位レベルへのポインタがあります。struct sock
別のアドレスファミリのソケットを持つことができることを覚えておいてください。この説明はまだやや単純化されています。
最後の質問に答えるために、両方の定義は引用に適しています。
このブログ投稿は、実際にソケットを生成し、ファイル記述子を割り当てるプロセスの一部を非常によく説明しています。https://ops.tips/blog/how-linux-creates-sockets/