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