Rick Grendel
Rick Grendel

Reputation: 302

Reading from a named pipe won't give any output and blocks the code indefinitely

I wrote a piece of code with a IPC purpose. The expected behaviour is that the code reads the content from the named-pipe and prints the string (with the Send("log", buff.String())). First I open the named-pipe 'reader' inside the goroutine, while the reader is open I send a signal that the data can be written to the named-pipe (with the Send("datarequest", "")). Here is the code:

var wg sync.WaitGroup
wg.Add(1)

go func() {
    //reader part
    file, err := os.OpenFile("tmp/"+os.Args[1], os.O_RDONLY, os.ModeNamedPipe)
    if err != nil {
        Send("error", err.Error())
    }

    var buff bytes.Buffer
    _, err = io.Copy(&buff, file)

    Send("log", buff.String())

    if err != nil {
        Send("error", err.Error())
    }

    wg.Done()
}()

Send("datarequest", "")
wg.Wait()

And here is the code which executes when the signal is send:

    //writer part
    file, err := os.OpenFile("tmp/" + execID, os.O_WRONLY, 0777)

    if err != nil {
        c <- "[error] error opening file: " + err.Error()
    }

    bytedata, _ := json.Marshal(moduleParameters)
    file.Write(bytedata)

So the behaviour I get it that the code blocks indefinitely when I try to copy it. I really don't know why this happens. When I test it with cat in the terminal I do get the intended result so my question is how do I get the same result with code?

Edit

The execID is the same as os.Args[1]

Upvotes: 1

Views: 182

Answers (1)

Shang Jian Ding
Shang Jian Ding

Reputation: 2146

The writer should close the file after it's done sending using file.Close(). Note that file.Close() may return error.

Upvotes: 2

Related Questions