2 つのサーバー ソケットを作成select()
し、それらを呼び出して新しい接続を待機する親プロセスがあります。接続が到着すると、メッセージが子プロセスに送信されます (fork()
サーバー ソケットの作成後に で作成されるため、共有されます)。
この子でaccept()
は、サーバー ソケットでの呼び出しは機能しません。エラーが発生しましたEAGAIN
(ノンブロッキング ソケット)。一方、メイン プロセスの呼び出しaccept()
は完全に機能します。
もちろん、私はaccept()
メイン プロセスをまったく呼び出しません。動作するかどうかをテストしただけで、動作します。
親accept()
プロセスの後に子プロセスを呼び出せないのはなぜですか?select()
編集: ここでの目標は、prefork モデルのように、クライアント接続を処理するために一定数のワーカー (8 としましょう) を作成することです。これらの接続は、HTTP とは異なり、長時間の接続になります。目標は、ワーカー間の接続の負荷を分散することです。
これを行うには、現在接続されているクライアントの数をワーカーに格納する共有メモリ変数を使用します。クライアント数が最も少ないワーカーに、新しい接続を処理するよう「依頼」したいと考えています。
そのselect()
ため、新しい接続を処理するプロセスを「選択」したいので、親で を実行してから子プロセスにメッセージを送信します。
サーバーは複数のソケット (ssl 用に 1 つ、ssl 用に 1 つ、なし) でリッスンします。これが、子プロセスでselect()
直接ではなく使用する理由です。これは、子ワーカーで複数のソケットを使用できないためです。accept()
accept()