1. ホーム

ファイル記述子不良の解決方法

2022-02-25 15:08:40

ソケットを生成した後、プロセスディスクリプタのインデックス番号に対応する整数値を返します。

ファイルディスクリプタの数には限りがあり、何度もソケットを作成すると当然ながら消費してしまい、openに失敗してしまいます。

オープンするときに作るハンドルのようなDD(あなたの場合はfd=socket()ですね)、それを解放したり閉じたりしないと、OSがサポートする最大値に達するともうオープンできなくなるのだそうです。Solarisではulimitで最大値を変更することができます。

サーバーは select() モデルを使用して、読み取り可能なソケットと書き込み可能なソケットを、それぞれ共有メモリの読み取りソケットキューと書き込みソケットキューに入れます。読み取り可能なソケットと書き込み可能なソケットは、それぞれ読み取りソケットと書き込みソケットを処理する2つの子プロセスによって、共有メモリから読み取られます。







問題:クライアントがサーバーに接続し、サーバーにデータを送信する。メインサーバプロセスは、読み取り可能なソケットを共有メモリ内の読み取りソケットキューに入れ、子プロセスは共有メモリからソケットを読み取り、そのソケットでrecv()を呼び出してデータを読み取ります。プログラムはエラーを返し、エラーコードから不良ファイル記述子であることがわかる。







また、FD_ISSET()にお願いしたいのは、その







select(maxFd + 1, &readSet, &writeSet, NULL, NULL);







接続されたソケットconnectfdは、クライアントからデータを送信していないのに、なぜFD_ISSET(connectfd, &readSet) は常にソケットが読み取り可能であると返すのですか?

子プロセスが生成された後、親プロセスが開いた新しいソケットは、子プロセスが直接利用できなくなるはずです。

親プロセスのコネクションでデータを検出し、子プロセスがrecv?



これはうまくいかないと思うんですよね。各プロセスにはバッファがあり、selectで検出されたデータは子プロセスのバッファにはないので、子プロセスで読み込むことはできません。親プロセスで読んで、子プロセスの共有メモリに書き込めばいいんです。