diff options
Diffstat (limited to 'v_windows/v/old/examples/process')
| -rw-r--r-- | v_windows/v/old/examples/process/.ignore | 1 | ||||
| -rw-r--r-- | v_windows/v/old/examples/process/command.v | 34 | ||||
| -rw-r--r-- | v_windows/v/old/examples/process/execve.v | 17 | ||||
| -rw-r--r-- | v_windows/v/old/examples/process/process_script.v | 59 | ||||
| -rw-r--r-- | v_windows/v/old/examples/process/process_stdin_trick.v | 83 | 
5 files changed, 194 insertions, 0 deletions
diff --git a/v_windows/v/old/examples/process/.ignore b/v_windows/v/old/examples/process/.ignore new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/v_windows/v/old/examples/process/.ignore @@ -0,0 +1 @@ +command
\ No newline at end of file diff --git a/v_windows/v/old/examples/process/command.v b/v_windows/v/old/examples/process/command.v new file mode 100644 index 0000000..718ce96 --- /dev/null +++ b/v_windows/v/old/examples/process/command.v @@ -0,0 +1,34 @@ +module main + +import os + +// basic example which shows how to use the Command function + +fn exec(path string) string { +	mut out := '' +	mut line := '' +	mut cmd := os.Command{ +		path: path +	} +	cmd.start() or { panic(err) } + +	for { +		line = cmd.read_line() +		println(line) +		out += line +		if cmd.eof { +			return out +		} +	} +	return out +} + +fn main() { +	mut out := '' +	exec("bash -c 'find /tmp/'") +	out = exec('echo to stdout') +	out = exec('echo to stderr 1>&2') +	println("'$out'") +	// THIS DOES NOT WORK, is error, it goes to stderror of the command I run +	assert out == 'to stderr' +} diff --git a/v_windows/v/old/examples/process/execve.v b/v_windows/v/old/examples/process/execve.v new file mode 100644 index 0000000..f840c8d --- /dev/null +++ b/v_windows/v/old/examples/process/execve.v @@ -0,0 +1,17 @@ +module main + +import os + +fn exec(args []string) { +	os.execve('/bin/bash', args, []) or { +		// eprintln(err) +		panic(err) +	} +} + +fn main() { +	// exec(["-c","find /"]) //works +	exec(['-c', 'find /tmp/']) // here it works as well + +	// exec(["-c","find","/tmp/"])  // does not work I guess is normal +} diff --git a/v_windows/v/old/examples/process/process_script.v b/v_windows/v/old/examples/process/process_script.v new file mode 100644 index 0000000..fa415e7 --- /dev/null +++ b/v_windows/v/old/examples/process/process_script.v @@ -0,0 +1,59 @@ +module main + +import os + +// a test where we execute a bash script but work around where we put script in bash inside bash + +fn exec(path string, redirect bool) { +	mut line := '' +	mut line_err := '' +	mut cmd := os.new_process('/bin/bash') + +	if redirect { +		cmd.set_args(['-c', '/bin/bash /tmp/test.sh 2>&1']) +	} else { +		cmd.set_args([path]) +	} + +	cmd.set_redirect_stdio() +	cmd.run() +	if cmd.is_alive() { +		for { +			line = cmd.stdout_read() +			println('STDOUT: $line') + +			if !redirect { +				line_err = cmd.stderr_read() +				println('STDERR: $line_err') +			} + +			if !cmd.is_alive() { +				break +			} +		} +	} +	if cmd.code > 0 { +		println('ERROR:') +		println(cmd) +		// println(cmd.stderr_read()) +	} +} + +fn main() { +	script := ' +echo line 1 +#will use some stderr now +echo redirect 1 to 2  1>&2 +echo line 3 +' + +	os.write_file('/tmp/test.sh', script) or { panic(err) } +	// os.chmod("/tmp/test.sh",0o700) //make executable + +	// this will work because stderr/stdout are smaller than 4096 chars, once larger there can be deadlocks +	// in other words this can never work reliably without being able to check if there is data on stderr or stdout +	exec('/tmp/test.sh', false) + +	// this will always work +	exec('/tmp/test.sh', true) +} 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') +}  | 
