親が開いたリスナーソケットファイル記述子を子が閉じないとどうなりますか?親が開いたリスナーソケットファイル記述子を子が閉じないとどうなりますか?
両方ともマスターリスナーfdでリッスンしている場合、どのプロセスが起動しますか?
親が開いたリスナーソケットファイル記述子を子が閉じないとどうなりますか?親が開いたリスナーソケットファイル記述子を子が閉じないとどうなりますか?
両方ともマスターリスナーfdでリッスンしている場合、どのプロセスが起動しますか?
プロセスは「起床」されません。accept(2)
に電話する必要があります。ここで何が起こっているのですか?
あなたは、あなたが「リスニング状態」にソケットを設定し
s = socket(....);
などA構造体、カーネルは多くのリソースを割り当てますソケットを作成します。カーネルはこれを認識し、構造体に1つか2つのフラグを反転します。
listen(s, -1);
fork(2)
となりました。ファイルディスクリプタは2つあります。接続が到着しました。誰がそれを手に入れる?
accept
を最初に呼び出した人は誰でもです。両者が現在accept
を待っている場合、その注文を決定することはできません。
接続が到着すると、カーネルはそれを「保留中の接続」のキューに追加します。そのファイルディスクリプタを持つプロセスが開かれたらaccept(2)
、カーネルはキューから1つの接続を削除し、それを呼び出し元に渡します(新しいファイルディスクリプタを返します)。
結論として、子プロセスがファイル記述子を継承すると、単に接続を受け入れるチャンスが得られます。
いくつかのプロセスは同じソケットのaccept()
にできます。接続が到着すると、OSによっては、1つのプロセスまたはすべてのプロセス(群れの雷)を起動する可能性がありますが、新しい接続を確立するには1つのプロセスしか成功しません。