0

入力と出力にstdioを使用する古いC++コードがいくつかあります。このコードは、フォークを介して新しいプロセスも生成します。stdioを新しいプロセスごとに再マップして、各セッションがそれぞれのデータを取得できるようにします。

Javaでスレッドを使用して子プロセスを作成することを検討しています。ただし、リマップSystem.inの方法System.outSystem.err、作成時の子スレッドを見つけることに関しては、行き詰まっています。

これが可能であれば、誰かが私を正しい方向に向けてくれませんか?

4

4 に答える 4

1

スレッドを生成することは、プロセスを生成することと同じではありません。Java(およびC ++)でスレッドを生成すると、そのスレッドはスポナーと同じメモリスペースを共有します(つまり、同じsdioストリームを共有します)。Javaで新しいプロセスを生成する場合は、Runtime.exec()を使用してから、ioを新しいプロセスに手動でパイプする必要があります。javaはプロセスの境界を越えたioストリームの共有をサポートしていません。

于 2011-02-13T16:41:47.297 に答える
1

簡単な答えは、System.out / in/errに直接アクセスするようにコードを記述しないことです。代わりに、オブジェクトのコンストラクターにInputStream1と2OutputStreamを渡します。その後、オブジェクトはそれらのオブジェクトと直接連携し、実際に何にマップされているかに依存しません。print()とにアクセスするには、のコンストラクターにをprintln()渡します。OutputStreamPrintStream

次に、実際に実行したいことに基づいて、System.outまたはいくつかのaを使用してコンストラクターを呼び出すことができますFileOutputStream

于 2011-02-13T16:25:58.000 に答える
0

Javaにはfork()はありませんが、新しいプロセス(Processクラスのオブジェクト)を開始するためのProcessBuilderとRuntime.exec()があります。fork()/ exec()のペアと考えることができますが、dup2()のようにその間に何かを実行する機能はありません。つまり、子プロセスのstdioをリダイレクトすることはできませんが、対応するProcessメソッド、正確には、入出力ストリームの対応するメソッドを使用して、stdinに明示的に書き込み、stdoutとstderrから読み取ることができます。 ProcessクラスのgetInputStream()/ getOutputStream()/ getErrorStream()メソッドによって返されます。スレッドの代わりにプロセスが必要な場合、これは有効な回避策になる可能性があります。

スレッドを使用する場合は、すべて同じstdioを共有します。リダイレクトすることはできますが、リダイレクトはすべてのスレッドに影響するため、意味がありません。カスタムInputStream/OutputStream実装を使用して、スレッドでIPCのある種の模倣を使用できます。または、PipedInputStream/PipedOutputStreamのペアを確認することもできます。これらは実際にIPCパイプのようなものをセットアップするために使用でき、おそらく過度のブロッキングを回避するためにBufferedInputStream/BufferedOutputStreamと組み合わせて使用​​できます。

于 2011-02-13T17:17:14.683 に答える
0

個別のプロセスを使用するか、各スレッドにPrintStreamを明示的に割り当てることをお勧めします。

ただし、各スレッドがSystem.outに対して同じオブジェクトを認識している場合でも、System.outへの書き込みをスレッドごとに異なる場所に転送することは可能です。スタートアップコードでは、カスタムPrintStreamを使用してSystem.setOut(PrintStream)を呼び出します。このPrintStreamは、すべてのprintメソッドとwriteメソッドをオーバーライドします。これらのメソッドでは、InheritableThreadLocalを使用してスレッドのPrintStreamを検索し、メソッド呼び出しをそれに転送します。

于 2011-02-13T17:25:51.830 に答える