トップ     差分 バックアップ   リロード     一覧 単語検索 最終更新
  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • Java/Tips/Javaで,子プロセスを使うときの注意点 へ行く。
  • Java/Tips/Javaで,子プロセスを使うときの注意点 の差分を削除

[[Java Tips]]

* Javaで,子プロセスを使うときの注意点 [#o2ed69de]

Javaでは,java.lang.Runtime#exec(...) を使うことで,子プロセスを起動し,外部のプログラムを実行できます.
Javaでは,[[java.lang.Runtime>http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Runtime.html#exec(java.lang.String)]]#exec(...) を使うことで,子プロセスを起動し,外部のプログラムを実行できます.

しかし,このメソッドは,使い方を誤るとリソースリークを引き起こします.

exec() は,戻り値として,java.lang.Process を返します.

[[Process>http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Process.html]] には,以下の5つのメソッドがあります.

- void destroy() 
-- サブプロセスを終了します。 
- int exitValue() 
-- サブプロセスの終了コードを返します。 
- InputStream getErrorStream() 
-- サブプロセスのエラーストリームを取得します。 
- InputStream getInputStream() 
-- サブプロセスの入力ストリームを取得します。 
-  OutputStream getOutputStream() 
-- サブプロセスの出力ストリームを取得します。 
- int waitFor()  
-- 必要な場合に、この Process オブジェクトが表すプロセスが終了するまで現在のスレッドを待機させます。

問題となるのは,getErrorStream, getInputStream, getOutputStream の3つです.
これらは,それぞれ,InputStreamとOutputStream を返し,子プロセスの標準入出力と標準エラー出力を読み書き出来ます.

標準入出力や標準エラー出力にアクセスしなければ用がないのですが,用がない場合でも,明示的にすべてのストリームをcloseしてやらないと,ファイルディスクリプタを解放せず,保持し続けます.

数回実行する程度なら問題が表面化しませんが,繰り返し実行すると,最後にはファイルディスクリプタが足りなくなり,"Too many open files"というメッセージとともに,例外が発生し,ファイルが開けなくなります.

子プロセス呼び出し後は,必ず,ストリームを閉じなければなりません.

例えば,次のようになります.

 Process process = null;
 try {
     process = Runtime.getRuntime().exec("someone_command");
     process.waitFor();
 }
 finally {
     if(process != null) {
         process.getErrorStream().close();
         process.getInputStream().close();
         process.getOutputStream().close();
         process.destroy();
     }
 }
トップ   編集 差分 バックアップ リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Site admin: shingo

PukiWiki 1.5.4 © 2001-2022 PukiWiki Development Team. Powered by PHP 8.1.20. HTML convert time: 0.001 sec.