diff options
Diffstat (limited to 'v_windows/v/old/examples/process/process_stdin_trick.v')
-rw-r--r-- | v_windows/v/old/examples/process/process_stdin_trick.v | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/v_windows/v/old/examples/process/process_stdin_trick.v b/v_windows/v/old/examples/process/process_stdin_trick.v new file mode 100644 index 0000000..7a1455d --- /dev/null +++ b/v_windows/v/old/examples/process/process_stdin_trick.v @@ -0,0 +1,83 @@ +module main + +import os + +// this is a example script to show you stdin can be used and keep a process open + +fn exec(cmd string) (string, int) { + mut cmd2 := cmd + mut out := '' + mut line := '' + mut rc := 0 + mut p := os.new_process('/bin/bash') + + // there are methods missing to know if stderr/stdout has data as such its better to redirect bot on same FD + // not so nice trick to run bash in bash and redirect stderr, maybe someone has a better solution + p.set_args(['-c', 'bash 2>&1']) + p.set_redirect_stdio() + p.run() + + if !cmd2.ends_with('\n') { + cmd2 += '\n' + } + + p.stdin_write(cmd2) + p.stdin_write('\necho **OK**\n') + + for { + if !p.is_alive() { + break + } + line = p.stdout_read() + println(line) + // line_err = p.stderr_read() //IF WE CALL STDERR_READ will block + // we need a mechanism which allows us to check if stderr/stdout has data or it should never block + // is not a good way, need to use a string buffer, is slow like this + out += line + if out.ends_with('**OK**\n') { + out = out[0..(out.len - 7)] + break + } + } + + // println("read from stdout, should not block") + // is not really needed but good test to see behaviour + // out += p.stdout_read() + // println("read done") + + // println(cmd.stderr_read()) + + if p.code > 0 { + rc = 1 + println('ERROR:') + println(cmd2) + print(out) + } + // documentation says we need to call p.wait(), but this does not seem to work, will be process stop or become zombie? + // p.wait() + + return out, rc +} + +fn main() { + mut out := '' + mut rc := 0 + + // the following does not work, not sure why not + // out,rc = exec("find /tmp/ && echo '******'") + + out, rc = exec("find /tmp/ ; echo '******'") + println(out) + assert out.ends_with('******\n') + + out, rc = exec('echo to stdout') + assert out.contains('to stdout') + + out, rc = exec('echo to stderr 1>&2') + assert out.contains('to stderr') + + out, rc = exec('ls /sssss') + assert rc > 0 // THIS STILL GIVES AN ERROR ! + + println('test ok stderr & stdout is indeed redirected') +} |