I didn't read your code carefully yet but I think you're meaning to
copy streams between my Clojure code and the sub-process, actually
I've tried this but this is probably not what I want.
I might not make myself clear. So here I go again:
  1. I writing a program which will open an OS shell (that means "cmd"
under Windows and "bash" under Linux) as sub-process
  2. this "shell" thing will not terminate while my code is still
running, all system commands such as dir/ls/cat etc. will be thrown
into     the shell's input-stream to execute and the result is pulled
from shell's output-stream/err-stream
  3. because when the shell will finish its execution is
unpredictable, I chained an "echo stop-sign" command to original
command so that the program can get the sign when execution done. E.g.
for command "dir", I will throw "dir &echo stop-sign" to the shell,
when a stop-sign is captured then it knows the execution finished
  4. it works well so far but when the system command is interactive
one such as 'time' (in Windows), the program will hang; if there are
ways to know when to require user input then I can resolve this in the
code, but the answer is NO. I didn't find a way to detect this
  5. thus I tried to find out any workarounds but failed. I also tried
the way you mentioned here, it can work in an interactive way but in
this case I cannot get the control back.

That's all the things I'm struggling on...

On Jan 10, 4:54 pm, Alan Malloy <a...@malloys.org> wrote:
> On Jan 9, 9:24 pm, Phil Hagelberg <p...@hagelb.org> wrote:
>
> > jaime <xiejianm...@gmail.com> writes:
> > > Later on I tried to add code that can make this possible but I found
> > > there's no way to detect if a command requires user's input and thus I
> > > have to find another way to make it work - but I didn't success and
> > > have been struggling for a workaround for a long while....
>
> > > anyone has any idea?
>
> > As far as I know this is impossible to do without bringing in
> > third-party libraries; this is just a (rather serious) shortcoming of
> > the JDK. I haven't looked into it enough to know which libraries would
> > offer it though.
>
> This should be possible if you don't mind suiciding your own process's
> stdin/stdout, by blindly forwarding all your input and output through
> the child. But if you send the child some input it didn't need, and it
> terminates, and then later you need your own stdin again, some pieces
> will be missing.
>
> I was going to attach a simple proof of concept to this, but I can't
> seem to get it right. So instead, here's what I was trying to do, and
> if someone wants to take it up this might be something useful to work
> from:
>
> (ns fork.core
>   (:require [clojure.java.io :as io])
>   (:import (java.io PipedReader PipedWriter))
>   (:gen-class))
>
> (defn -main [& args]
>   (println "Start typing, I'll cat it back atcha!")
>   (let [child (-> (Runtime/getRuntime) (.exec "/bin/cat"))
>         cin (.getInputStream child)
>         cout (.getOutputStream child)
>
>         in-pipe-in (PipedReader.)
>         in-pipe-out (PipedWriter. in-pipe-in)
>
>         out-pipe-in (PipedReader.)
>         out-pipe-out (PipedWriter. out-pipe-in)
>
>         in *in*, out *out*] ;; avoid dynamic-binding issues
>     (future (io/copy in in-pipe-out)) ;; read my stdin...
>     (future (io/copy in-pipe-in cout)) ;; write it to child's stdin
>
>     (future (io/copy cin out-pipe-out)) ;; read child's stdout...
>     @(future (io/copy out-pipe-in out)) ;; write it to my stdout, and
> wait for it to finish
>     (let [exit-code (.waitFor child)]
>       (println "Child process finished with exit code" exit-code)
>       exit-code)))

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to