2011-05-02 59 views
0

我有一個運行在Java上的進程運行時的shell腳本。 這個shell腳本只在你點擊時停止CTRL + C 現在我從JTextArea的腳本中捕獲InputStream。 但我不能發送CTRL + CCtrl C通過Linux中的OutputStreamWriter

當您在殼牌的Konsole運行CTRL +ç腳本停止併發送回信息。 這個信息是我無法捕捉的信息。

所以 我怎麼能發送CTRL +ç通過流程運行? 如何從捕捉輸入流CTRL + C

File dirw = new File("/home/mydir/sh/"); 
Runtime runtime = Runtime.getRuntime(); 
Process process = null; 
process = runtime.exec("./start_test.sh", null, dirw); 

OutputStream outp = new OutputStream(process.getOutputStream()); 
InputStreamReader isr = new InputStreamReader(process.getInputStream()); 
BufferedReader br = new BufferedReader(isr); 
String line = null; 

int cont = 1; 
while ((line = br.readLine()) != null) { 
     jtextarea.append("LineOK " + line + "\n"); 
     if(cont == 10) { 
      outp.write(3); //sending Ctrl+C 
      outp.flush(); 
      cont =0; 
     } 
     cont ++; 
} 
+0

對於你正在寫字符'3'而不是控制代碼的人。 – Clint 2011-05-02 17:34:46

回答

2

CTRL + Ç是從用戶發送到殼的命令。當shell收到它時,它將SIGINT發送到前臺進程。

要在Java中使用Process.sendSignal(pid, Process.SIGNAL_QUIT) - 這隻適用於Android。

更新:上述命令是錯誤的,因爲它只能在Android上使用。

正確的方法是發送kill -2 pid。注意:這是純UNIX解決方案。另一個問題是獲取pid(進程ID)。事實證明,它沒有與操作系統無關的解決方案:How to get PID of process I've just started within java program?

解決方案是通過操作系統相關的hacks,如鏈接中所述(通過反射從過程獲取pid)。

+0

我正在使用串行端口和進程沒有方法sendSignal – Mau86 2011-05-02 17:57:47

+0

是的,你說得對。我很快發佈。更新了答案。 – 2011-05-02 17:58:38

+0

我嘗試按照你的建議去做,但沒有奏效。我找到了進程ID。但是當我想要殺死它時(鍵入Kill -SIGINT PID)沒有任何事情發生在konsole框架上,我仍然在收到信息,就好像我還在運行該程序,但在Process表(KsysGuard)上它殺死了它。我也嘗試不同的信號,但我得到了同樣的結果。正如我之前在Konsole上告訴您的,當您按Ctrl + c時,程序停止運行併發回信息。 – Mau86 2011-05-03 15:44:54