I actually fixed this a couple of days ago (see here <http://github.com/rikonor/stdio-wrapper>) without realizing what the issue was, but now I understand! Thank you!
On Fri, Feb 9, 2018 at 10:27 PM Matt Harden <matt.har...@gmail.com> wrote: > You need to close fIn after the copy is done. As it is now, fIn.Close() > happens after io.Copy(os.Stdout, buf), which completes after your cat > command finishes. But cat won't finish until its input pipe returns EOF, > which happens after fIn.Close(). > > On Wed, Feb 7, 2018 at 5:46 PM Or Rikon <riko...@gmail.com> wrote: > >> Hi! >> >> I asked this previously on Stack Overflow but so far have not received a >> response, so I figured I will try here as well. >> >> I'm trying to wrap an executable that takes an input and output file >> paths as arguments, such that it will be possible to provide the input and >> output as stdin and stdout. >> >> I've written a short script in Go that attempts to do this, but for some >> reason which eludes me, it hangs forever. >> >> >> Here is the script: >> >> >> package main >> import ( >> "bytes" >> "io" >> "log" >> "os" >> "strings" >> "syscall" >> >> "golang.org/x/sync/errgroup") >> /* >> Expected behavior: >> >> # Terminal 1 >> $ go run main.go >> >> # Terminal 2 >> $ cat inPipe > outPipe >> >> The go program is writing to inPipe and reading from outPipe >> >> Actual behavior: The program stalls >> */ >> >> func main() { >> eg := &errgroup.Group{} >> >> inPipe := "inPipe" >> outPipe := "outPipe" >> >> if err := syscall.Mkfifo(inPipe, 0644); err != nil { >> log.Fatal(err) >> } >> defer os.Remove(inPipe) >> >> if err := syscall.Mkfifo(outPipe, 0644); err != nil { >> log.Fatal(err) >> } >> defer os.Remove(outPipe) >> >> fIn, err := os.OpenFile(inPipe, os.O_WRONLY, os.ModeNamedPipe) >> if err != nil { >> log.Fatal(err) >> } >> defer fIn.Close() >> >> eg.Go(func() error { >> _, err := io.Copy(fIn, strings.NewReader("123")) >> return err >> }) >> >> fOut, err := os.OpenFile(outPipe, os.O_RDONLY, os.ModeNamedPipe) >> if err != nil { >> log.Fatal(err) >> } >> defer fOut.Close() >> >> buf := &bytes.Buffer{} >> >> eg.Go(func() error { >> _, err := io.Copy(buf, fOut) >> return err >> }) >> >> if err := eg.Wait(); err != nil { >> log.Fatal(err) >> } >> >> if _, err := io.Copy(os.Stdout, buf); err != nil { >> log.Fatal(err) >> }} >> >> -- >> 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. >> For more options, visit https://groups.google.com/d/optout. >> > -- 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. For more options, visit https://groups.google.com/d/optout.