質問

私は、任意のコマンドラインアプリケーションを実行し、それが生産されますように、その標準出力を読みたいです。私はパイプを作成し、CreateNamedPipeにもう一方の端(オープン使用CreateFile)を供給するためにCreateProcessを使用します。明示的に標準出力バッファリングを操作するには必ず問題のパイプがunbufferredあるいは少なくともシステムの最小バッファサイズとして使用されていることであることを確認する方法は、ターゲット・プロセスがあるしない提供?

役に立ちましたか?

解決

あなたは本当にバッファサイズを制御することはできません。あなたは<のhref =「http://msdn.microsoft.com/en-us/library/aa365150%28VS.85%29.aspx#ctl00_MTCS_main_ctl18」のrel = "nofollowをnoreferrerに1の読み取りおよび書き込みバッファサイズを渡すことができます「> CreateNamedPipe のが、カーネルが自動的にこれらのバッファサイズを増加します。基本的には、バッファは常に、少なくとも任意の時間に読む準備ができてきたデータの最大量と同じ大きさになります。別の言い方をすれば、より速くあなたがパイプに書き込まれたデータのブロックを利用可能データに対応し、より小さな、小さなバッファが残ります。

  

入出力バッファサイズはアドバイザリです。名前付きパイプの各端部のために予約さ実際のバッファサイズは、システムのデフォルトは、システムの最小値または最大値のいずれかであるか、または指定されたサイズは、次の割り当て境界に切り上げ。パイプの書き込み操作が発生するたびに...、システムは、最初のパイプの書き込みクォータにメモリを充電しようとします。残りのパイプライト・クォータは、要求を満たすためには小さすぎる場合...、システムがプロセスのために確保非ページプールを使用してデータに対応するために、バッファを拡大しようとします。

しかし、私はバッファサイズは本当に重要だと思いません。パイプは、バッファが「満杯」になるまで、データの送信を遅らせ、およびので、あなたの待ち時間を改善しないであろう小さなバッファサイズを維持し、TCPのための「ネーグル」オプションに何も相当ありますしません。

あなたは、コンソールアプリケーションのstdoutに配管を接続するとき、のそれはパイプに書き込まれる前、出力は通常、そのアプリケーションのことでバッファリングされていることに注意してください。あなたがバッファリングされていない出力をしたい場合は、標準エラー出力を使用する必要があります。

また、継承されたパイプハンドルを使用する際に注意する何かが生み出されたアプリケーションは、すべてのハンドルを継承することで、ファイルやソケットのオープンを持っているので、もしあなたがアプリケーションを起動し、近くにそのハンドル、ファイル/ソケットは、/ etc。予想外の共有違反やその他の奇妙な問題を引き起こす可能性が生まれた子プロセスが停止するまで開いたままになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top