if the target program is under your control, you can just write to a file, 
write the location to that file to the stdin and pick up from the file in the 
target...

[Joop Kiefte - Chat @ 
Spike](https://spikenow.com/r/a/?ref=spike-organic-signature&_ts=ph9ch)   
[ph9ch]

On October 1, 2020 at 0:16 GMT, Patrick Smith <pat42sm...@gmail.com> wrote:

Not a general solution, but if you are only writing a small amount of data, you 
can simply write it to the pipe and then exec the other program: 
https://play.golang.org/p/e0UQRE6SsT4

If I recall correctly, many years ago you would have been able to write 256 
bytes this way. No doubt someone else can tell you the current limit.

On Wed, Sep 30, 2020 at 4:42 PM Chris Tierney <christier...@gmail.com> wrote:

I'm ok with my Go program being in the process table briefly; the goal was just 
to not include it in the process chain of the exec'd program. And the exit code 
handling is trivial, yes, but a bit undesirable to my mind: 
https://stackoverflow.com/a/10385867. Admittedly this is a matter of taste (and 
wanting to explore & understand `syscall` better) as much as anything.

I did get the inverted solution working: https://play.golang.org/p/l3ScCv1lHVw

On Wednesday, September 30, 2020 at 6:56:28 PM UTC-4 Kurtis Rader wrote:

The way you describe the requirements there is no solution. Not in Go, C, or 
any other language. You could try to invert the problem by creating a pipe, 
forking your Go program, having the forked copy write to the pipe, then exec 
the other program and have it read from the pipe. But that still leaves your Go 
program in the process table; albeit under a new PID. I don't understand why 
you can't do it in the straightforward fashion using exec.Command. The "custom 
code to read and return the right exit code from the child" is trivial unless 
you need to propagate the exit status that occurs when the process terminates 
due to a signal.

On Wed, Sep 30, 2020 at 3:33 PM Chris Tierney <christ...@gmail.com> wrote:

I'm looking for a way to exec a process (as in, `execve(2)`) and write 
something to its stdin.

Context: I am writing a tool that does some argument processing and then 
executes another (arbitrary) program, and passes the processed data to that 
other program's stdin. The processed data cannot be written to disk because of 
security constraints, hence using stdin. This does not need to be portable as 
it will only run on Linux.

I can accomplish this with an `exec.Command`, but I would prefer not to because:

* my go executable will still appear in the process chain, and ideally it would 
not (I would rather it be replaced by the new process)
* I need the exit code from executing my go tool to be the exit code of the 
other process that gets executed. With `exec.Command` I need to write custom 
code to read and return the right exit code from the child; with `execve` this 
would happen automatically.

So the next obvious choice is `syscall.Exec`. This solves the above problems, 
but there's a new problem: no way that I can see to send data to the new 
process's stdin.

Exec Example: https://play.golang.org/p/HMY8QysTtE8 (Note: I'm using `awk` in 
this example, but that is just an example. My real code will execute other 
programs. In the playground you will not see the output from `awk` but if you 
run locally you will.)

So I tried `syscall.ForkExec`, which lets me use a pipe to write data to the 
new process. But the other program now has a different pid and the exit code is 
not returned. i.e., it has not replaced my go process---it's being exec'd in 
the forked process.

ForkExec Example: https://play.golang.org/p/ZhoAljhUFGp (Note: I'm using `awk` 
in this example, but that is just an example. My real code will execute other 
programs. In the playground you will not see the output from `awk` but if you 
run locally you will.)

Is there a way to accomplish this in go? Normally what I'd do is `fork` a 
process that would handle writing to a pipe, `dup` the read end of the pipe to 
stdin and then `exec` to the process I want to run, but `syscall` doesn't have 
a `Fork`. I could probably use `import "C"` but at that point I would just 
rather write the tool in C.

Thanks for any suggestions!

--
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts...@googlegroups.com.
To view this discussion on the web visit 
[https://groups.google.com/d/msgid/golang-nuts/0b245b98-81c7-4eb0-b3a7-61eca2db2a59n%40googlegroups.com](https://groups.google.com/d/msgid/golang-nuts/0b245b98-81c7-4eb0-b3a7-61eca2db2a59n%40googlegroups.com?utm_medium=email&utm_source=footer).

--

Kurtis Rader
Caretaker of the exceptional canines Junior and Hank

--
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
[https://groups.google.com/d/msgid/golang-nuts/bcb52bb2-eae8-4e8b-aec0-e28ffab61c81n%40googlegroups.com](https://groups.google.com/d/msgid/golang-nuts/bcb52bb2-eae8-4e8b-aec0-e28ffab61c81n%40googlegroups.com?utm_medium=email&utm_source=footer).

--
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
[https://groups.google.com/d/msgid/golang-nuts/CAADvV_s3DtJkz3E%3DsW-8gFkoeV9AeMR4ZGB3hBD4sTBcbPfNDw%40mail.gmail.com](https://groups.google.com/d/msgid/golang-nuts/CAADvV_s3DtJkz3E%3DsW-8gFkoeV9AeMR4ZGB3hBD4sTBcbPfNDw%40mail.gmail.com?utm_medium=email&utm_source=footer).

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/c-64693-kfq2p09q-dbqtf5%3D1aoxtxy%402.gethop.com.

Reply via email to