broken pipe
Hi,
I need to control an interpreter (4bol, implements some assembler like
language) from a java program. The 4bol interpreter sends it's results
to standard output, parsing errors to standard error. The problem is
that the java source at the end of this posting hangs with a
"java.io.IOException: Broken pipe" after the first parse error.
However, the interpreter itself recovers from parse errors and
continues operation when started interactively from a terminal window
with no java involved, and I'd like to have the same behaviour for the
java wrapper.
Can you work out from the following output and source code, why the
instruction "out.flush();" (which is line 49) in the command() method
causes the IOException "Broken pipe"?
(The input was
"move 4
add 3
mult 2
move 4"
with parse error recognized for "mult 2" and broken pipe when sending
the second "move 4")
Thanks
Norbert
--- output: ---
STD: Welcome to the 4bol test assembler
move 4
STD: 4
add 3
STD: 7
mult 2
ERR: parse error: mult 2
move 4
java.io.IOException: Broken pipe
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:66)
at
java.io.BufferedOutputStream.flush(BufferedOutputStream.java:124)
at
sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:410)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
at
java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
at java.io.BufferedWriter.flush(BufferedWriter.java:230)
at oboe.XProcess.command(XProcess.java:49)
at oboe.XProcess.main(XProcess.java:72)
--- end of output ---
--- java source: ---
import java.io.*;
class XProcess{
Process p;
BufferedReader in;
BufferedWriter out;
BufferedReader err;
public void listen(){
// Error output
new Thread(){
public void run(){
try {if (in.ready()){
String line = null;
while((line = err.readLine()) != null)
{
System.err.println("ERR: "+line);
}
}} catch (IOException e){ System.err.println(e);}
}
}.start();
// Stdout output
new Thread(){
public void run(){
try {if (in.ready()){
String line = null;
while((line = in.readLine()) != null)
{
System.out.println("STD: "+line);
}
}} catch (IOException e){ System.err.println(e);}
}
}.start();
}
public void launch(String cmd){
try { p = Runtime.getRuntime().exec(cmd);
} catch (IOException e){
e.printStackTrace();
};
in=new BufferedReader(new InputStreamReader(p.getInputStream()));
err=new BufferedReader(new InputStreamReader(p.getErrorStream()));
out=new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
}
public void command(String cmd){
try {
out.write(cmd+"\n");
out.flush();
} catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String[] argv){
String line="";
boolean done=false;
XProcess p=new XProcess();
p.launch("4bol");
try { Thread.sleep(1000);
} catch (InterruptedException e){};
p.listen();
while(!done){
line="";
try{
line=new BufferedReader(new InputStreamReader(System.in)).readLine();
} catch (IOException e){
e.printStackTrace();
}
if (line.equals("quit")) done=true;
else{
p.command(line);
p.listen();
}
}
}
}
--- end of java source ---