4

C# (コンソール) で記述された既存のシェルのようなコマンド ライン ユーティリティがあり、パイプ/リダイレクトのサポートを追加しようとしているので、コマンドは次のようになります。

MyShellPrompt> SomeCustomCommand | a.exe | b.exe | c.exe

a、b、および c.exe を作成し、たとえば bash のようにそれらの stdin/stdout を接続するように作成できます。具体的には、私のシェルにはシェル固有のカスタム コマンド (カスタム ハードウェアと対話する) があり、その出力は a.exe の stdin に書き込まれ、a.exe の stdout は b.exe の stdin にパイプされ、b.exe の stdout は c にパイプされます。 exeの標準入力。c.exe の stdout はシェル プログラムに継承されているため、コンソールに書き込むだけです。

このような回答は、stdin と stdout をリダイレクトできることを示していますが、同じパイプの両端を参照するサブプロセスを作成していないため、(起動プログラム) は 2 つの端を「接続」する必要があります。パイプ (1 つのプロセスから 2 番目のプロセスの入力への出力) は、データをすりつぶし、あるアプリの stdout から次の stdin にコピーすることによって行われます。これは一般的なケースでは退屈になる可能性があり、これが C++ Win32 exampleおよびC/Linuxで実行できることを考えると、必要ではないようです。しかし、.NET System.Diagnostics.Processクラスは、StandardInput および StandardOutput プロパティが読み取り専用であるため、いかなる種類のパイプ割り当ても提供していないようです。

.NET でこれを行う方法はありますか? (または、この機能の欠如のために、最初から私のシェルユーティリティにC#を選択したことは運命づけられていました(これに関しては)(初めてではないでしょう...):-) )。理想的には、これはプラットフォームの独立性を損なうため、P/Invoke を回避します...

あなたの答えが「はい、パイプ間でデータをコピーすることでこれを行うことができます」(上記のように) である場合は、(少なくとも私にとっては) それを捨てます。一般的なケースの実装は、わずかにN EXE を処理する場合、およびチェーンを流れる無制限の (または少なくとも大量の) データを処理する場合は、より困難になります。非同期 I/O を使用して N-1 パイプ接続のそれぞれの間をホップし、それらをすべて維持する必要があるようです (実際にはまだ試していません...)。または、N-1 スレッドを各パイプ専用にします接続(動作しているように見えます...)。:(

4

0 に答える 0