2010-11-18 15 views
0

sh'u etkileşimli modda bir alt işlem olarak yürüten bir Java programım var. Giriş System.in'dan kopyalanır ve çıktı System.out'a kopyalanır. Örneğin, çıktı bir yanlış sırada görünen bu interaktif kabuk komutları gibi pwd çalıştırırken Her şey dışında çalışıyor:Çıktı neden alt işlemden yanlış sırada mı?

$ pwd 
$ /home/viz/workspace 

yerine

$ pwd 
/home/viz/workspace 
$ 

fark ait olduğunu birinci durumda $ istemi, pwd çıkışından önce yazdırılır.

Neden olduğu hakkında herhangi bir fikir ve nasıl düzeltileceği? İşte

kodudur:

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

class StreamCopier implements Runnable { 
    private InputStream in; 
    private OutputStream out; 

    public StreamCopier(InputStream in, OutputStream out) { 
     this.in = in; 
     this.out = out; 
    } 

    public void run() { 
     try { 
      int n; 
      byte[] buffer = new byte[4096]; 
      while ((n = in.read(buffer)) != -1) { 
       out.write(buffer, 0, n); 
       out.flush(); 
      } 
      out.close(); 
     } 
     catch (IOException e) { 
      System.out.println(e); 
     } 
    } 
} 

public class Test { 
    public static void main(String[] args) 
      throws IOException, InterruptedException { 
     Process process = Runtime.getRuntime().exec("sh -i +m"); 
     Thread outThread = new Thread(new StreamCopier(
       process.getInputStream(), System.out)); 
     outThread.start(); 
     Thread errThread = new Thread(new StreamCopier(
       process.getErrorStream(), System.err)); 
     errThread.start(); 
     Thread inThread = new Thread(new StreamCopier(
       System.in, process.getOutputStream())); 
     inThread.start(); 
     process.waitFor(); 
     outThread.join(); 
     errThread.join(); 
     inThread.join(); 
    } 
} 
+0

farklı bir kabuk Ne çalıştırmak olur? – dacwe

+0

@dacwe: Sadece şu ana kadar çalışıyorum. Bash denedim ama IO yapmaya çalışırken durdu. Muhtemelen diğer bazı seçeneklere ihtiyaç duyar ('+ m' yardımcı olmaz). – vitaut

cevap

1

standart hata ve standart çıktı uyumsuz okuma verilerini yazdırmak farklı parçacığı gidin çünkü. 2>&1 yeniden yönlendirirseniz, işe yarayabilir, ancak Runtime.exec ile çalışacağından emin değilim ("dosya bulunamıyor - 2> & 1"). Yani sh çağırır ve onun çıkış yönlendirir bir kabuk yapmak ve Runtime.exec kullanarak o komut arayabilir:

#!/bin/sh 
sh -i +m 2>&1 

ve

Runtime.exec("customsh"); 
+0

Ama her ikisi de '$' ve '/ home/viz/workspace' standart çıktıda çıkarılmalıdır? (yani hiç yarış yok ..) – dacwe

+0

@dacwe Hayır. Komut satırı 'sh 1> temp.log'dan deneyin ve sonra' pwd' yazın. Komut satırı istemini göreceksiniz ama pwd çıkışı değil, temp.log'a gidecektir. – khachik

+0

Güzel! Sonra vitaut çözümü var! – dacwe

İlgili konular