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