任意のコマンド ライン アプリケーションを実行し、生成された標準出力を読みたいと思います。私は使用CreateNamedPipe
してパイプを作成し、もう一方の端 (開いている使用済みCreateFile
) を に供給しCreateProcess
ます。ターゲットプロセスが標準出力バッファリングで明示的に操作しない場合、問題のパイプがバッファリングされていないこと、または少なくともシステムの最小値がバッファサイズとして使用されていることを確認する方法はありますか?
1 に答える
バッファサイズを実際に制御することはできません。1からの読み取りおよび書き込みバッファサイズを渡すことができますCreateNamedPipe
が、カーネルはそれらのバッファサイズを自動的に増やします。基本的に、バッファは常に、任意の時点で読み取る準備ができているデータの最大量と少なくとも同じ大きさになります。言い換えると、利用可能なデータへの応答が速く、パイプに書き込まれるデータのブロックが小さいほど、残りのバッファーは小さくなります。
入力および出力バッファサイズは推奨値です。名前付きパイプの両端に予約されている実際のバッファサイズは、システムのデフォルト、システムの最小または最大、または次の割り当て境界に切り上げられた指定されたサイズのいずれかです。...パイプ書き込み操作が発生するたびに、システムは最初にパイプ書き込みクォータに対してメモリを充電しようとします。...残りのパイプ書き込みクォータが小さすぎて要求を満たすことができない場合、システムは、プロセス用に予約された非ページプールを使用してデータに対応するためにバッファを拡張しようとします。
ただし、バッファサイズはそれほど重要ではないと思います。パイプは、バッファが「いっぱい」になるまでデータの送信を遅らせません。また、TCPの「nagle」オプションに相当するものはないため、小さなバッファサイズを維持しても、レイテンシは改善されません。
パイプをコンソールアプリケーションに接続すると、出力は通常、パイプに書き込まれる前stdout
にそのアプリケーションによってバッファリングされることに注意してください。バッファなしの出力が必要な場合は、stderrを使用する必要があります。
また、継承されたパイプハンドルを使用する場合は、生成されたアプリケーションがすべてのハンドルを継承することに注意してください。ファイルまたはソケットを開いている場合は、アプリケーションを生成してから、そのハンドル、file / socket/etcを閉じます。 。生成された子プロセスが停止するまで開いたままになります。これにより、予期しない共有違反やその他の奇妙な問題が発生する可能性があります。