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.

Reply via email to