2011-11-21 139 views
2

我有一個小的可執行程序在C中產生大量輸出到文件。 當我把這個程序與運行,像這樣:運行時執行意外停止

Runtime r = Runtime.getRuntime(); 
Process p = null; 

p = r.exec("./my_program -in input.file -out output.file", null, new File(System.getProperty("java.io.tmpdir"))); 

當程序產生低輸出一切正常,但是當我打電話「* MY-*」具有大的輸入就會產生輸出量大到output.file,但在這種情況下,我的程序在Java凍結,並沒有發生...

我在終端測試「* my_program *」大量輸入和一切都好,但是當我打電話給使用Runtime.exec編寫Java程序,Java程序凍結。

- 預先感謝

+0

本文有點舊,但仍包含相關信息:[Runtime Exec will not](http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps。 HTML)。另外,你的應用程序是一個Swing應用程序嗎?可執行程序是否最終完成? –

+0

Runtime.exec本質上是一個管道連接,您必須準備好處理多個緩衝區信息。這是十幾條線路來做正確的。 –

+0

不,我的應用程序是一個Eclipse插件。我不這麼認爲,因爲我使用相同的輸入測試了相同的C程序,但是在終端運行並且工作正常... – josecampos

回答

1

確保您從進程的.getOutputStream().getErrorStream()如果你是不是已經閱讀。看看你的代碼片段,看起來你只是執行.exec(...)(也許等着它完成,呼叫沒有顯示到.waitFor()?)。

http://download.oracle.com/javase/6/docs/api/java/lang/Process.html(強調):

父進程使用這些流喂輸入,並從子輸出 。由於某些本地平臺僅爲標準輸入和輸出流提供有限的緩衝區大小,因此不及時寫入輸入流或讀取 子流程的輸出流可能導致子流程阻塞,甚至導致死鎖

+0

Yah,你是對的...我的C程序有很多printfs,我刪除它們,現在Runtime.exec()可以正常工作,因爲C程序的所有輸出都會輸出。文件...所以,輸出流有一個小的尺寸和子進程不會阻止!謝謝 ;) – josecampos