「\Device amedPipe\\Win32Pipes」ハンドルが「開いているファイルが多すぎます」エラーを引き起こす可能性がありますか?
質問
からの続き この質問:
Windows で fopen を実行しようとすると、「開いているファイルが多すぎます」というエラーが表示されます。開いているファイルの数を分析してみましたが、それほど多くないようです。
しかし、Process Explorer を実行すると、似たような名前のハンドルが多数開いていることに気づきました。"\Device amedPipe\Win32Pipes.00000590.000000e2"、"\Device amedPipe\Win32Pipes.00000590.000000e3" など。これらのハンドルの数は、プログラムが「開いているファイルが多すぎます」というメッセージを返して停止するまでに実行した反復回数と正確に同じであることがわかります。
私は答えを探しています。これらのハンドルは何ですか?実際に「開いているファイルが多すぎます」エラーを引き起こす可能性がありますか?
私のプログラムでは、リモートドライブからファイルをロードし、TCP/IP接続を作成しています。これらの操作の 1 つでこれらのハンドルを作成できますか?
解決
反復のたびにパイプを fclose() することを忘れていませんか?(下記の -> を参照)。
そうでない場合は、開いたパイプから漏れています。
for(i = 0; i < lotsOfIterations; i++)
{
FILE *fp;
fp = fopen(filename[i], "r");
if (fp != NULL)
{
... do work, etc
fclose(fp); // finished with this file handle (add this line!)
}
}
ただし、一度に多くのファイル ハンドルを開くことが目的の場合、もう 1 つ注意すべき点は、C ランタイムでは通常、一度に開くことができるファイル ハンドルの数が指定されていることです。この数値は通常、オペレーティング システムが提供できる数値よりもはるかに小さくなります。OS が提供するファイル ハンドルを使用するには、Win32/Win64 API 関数を使用する必要があります。
- ファイルの作成
- ファイルの読み取り
- ファイルの書き込み
- GetFileSize
- クローズハンドル
OS が提供するファイル ハンドルのタイプは FILE ではなく HANDLE *