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.