4

ProcessBuilder の JavaDoc には、次のように記載されています


プロセスを作成する方法は、ネイティブ ウィンドウ プロセス、デーモン プロセス、 Microsoft Windows の Win16/DOS プロセス、シェル スクリプトなど、特定のネイティブ プラットフォームの特殊なプロセスではうまく機能しない場合があります。

私の主な質問は、ProcessBuilder がデーモン プロセスでうまく動作しないことについてです。ProcessBuilder は、これらのタイプのアプリケーションを起動するための受け入れ可能な方法にはならないのでしょうか?

ありがとう!

4

1 に答える 1

1

私の推測 (コード grepで見つけたコメントに基づく) は、プロセスのストリームを処理する必要があるという事実に問題があり、この処理が問題になる可能性があるということです。

プロセスを作成する方法は、ネイティブ ウィンドウ プロセス、デーモン プロセス、Microsoft Windows の Win16/DOS プロセス、シェル スクリプトなど、特定のネイティブ プラットフォームの特殊なプロセスではうまく機能しない場合があります。作成されたサブプロセスには、独自の端末またはコンソールがありません。すべての標準 I/O (stdin、stdout、stderr) 操作は、3 つのストリーム (getOutputStream()、getInputStream()、getErrorStream()) を介して親プロセスにリダイレクトされます。親プロセスは、これらのストリームを使用して、サブプロセスに入力をフィードし、サブプロセスから出力を取得します。一部のネイティブ プラットフォームでは、標準の入力ストリームと出力ストリームに限定されたバッファー サイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りが迅速に行われないと、サブプロセスがブロックされたり、デッドロックが発生したりする可能性があります。

Processこれは、 が抽象クラスであり、すべての JRE/JDK が独自のプラットフォーム依存のプロセス実装 (例: など) を持っているUNIXProcessという事実にも関連している可能WindowsProcess性があります。一部のオペレーティング システムでは、Java がそのクラスでカバーできないプロセスを開くことに関連する制限があるだけかもしれません。ドキュメンテーション。

繰り返しますが、これは単なる推測であり、コードからはあまりわかりません。

私の経験から (*nix システムと Windows の両方で) - ほとんどの場合、コマンド ラインの作成方法、引数の指定方法 (argumentsパラメーターまたはコマンド ラインのいずれか)、および生成されたプロセスの環境を構築します (プロセスの値を継承するか、独自に作成します)。いずれにせよ、それは試行錯誤のゲームです。

于 2012-10-08T18:21:47.637 に答える