I'm trying to interact with an exterior program, and can't get it to work 
as I want. Let's say the program is "od" for example. I try:

julia> (so,si,pr) = readandwrite(`od`)
(Pipe(open, 0 bytes waiting),Pipe(open, 0 bytes waiting),Process(`od`, 
ProcessRunning))

julia> write(si,repeat("test\n",100))
500
julia> flush(si)
Pipe(open, 0 bytes waiting)

julia> readline(so)
^C # nothing happens, the process is blocking output

How do I manage to get Julia to give me the output of od? A line was 
already ready after the first 16 characters of input.

This is related to buffering: if I stuff the buffer, then I do get lines 
asynchronously:
julia> (so,si,pr) = readandwrite(`od`);
julia> write(si,repeat("test\n",10000));
julia> readline(so)
"0000000    062564  072163  072012  071545  005164  062564  072163 
 072012\n"

However, there also seems to be a bug in Julia here:
julia> (so,si,pr) = readandwrite(`od`);
julia> write(si,repeat("test\n",100000));
# and Julia is stuck
^CERROR: InterruptException:
ERROR (unhandled task failure): write: broken pipe (EPIPE)
 in yieldto at ./task.jl:21
 in wait at ./task.jl:309
 in wait at ./task.jl:225
 in wait_full at ./multi.jl:573
 in take! at ./multi.jl:744
 in take_ref at ./multi.jl:752
 in call_on_owner at ./multi.jl:718
 in anonymous at task.jl:86

julia> pr # hmmm... I wonder in which state the process is
^CERROR: InterruptException:

bash$ # Julia crashed

Reply via email to