package stdcopy_test import ( "errors" "fmt" "io" "os" "time" "github.com/moby/moby/api/pkg/stdcopy" ) func ExampleNewStdWriter() { muxReader, muxStream := io.Pipe() defer func() { _ = muxStream.Close() }() // Start demuxing before the daemon starts writing. done := make(chan error, 1) go func() { // using os.Stdout for both, otherwise output doesn't show up in the example. osStdout := os.Stdout osStderr := os.Stdout _, err := stdcopy.StdCopy(osStdout, osStderr, muxReader) done <- err }() // daemon writing to stdout, stderr, and systemErr. stdout := stdcopy.NewStdWriter(muxStream, stdcopy.Stdout) stderr := stdcopy.NewStdWriter(muxStream, stdcopy.Stderr) systemErr := stdcopy.NewStdWriter(muxStream, stdcopy.Systemerr) for range 10 { _, _ = fmt.Fprintln(stdout, "hello from stdout") _, _ = fmt.Fprintln(stderr, "hello from stderr") time.Sleep(50 * time.Millisecond) } _, _ = fmt.Fprintln(systemErr, errors.New("something went wrong")) // Wait for the demuxer to finish. if err := <-done; err != nil { fmt.Println(err) } // Output: // hello from stdout // hello from stderr // hello from stdout // hello from stderr // hello from stdout // hello from stderr // hello from stdout // hello from stderr // hello from stdout // hello from stderr // hello from stdout // hello from stderr // hello from stdout // hello from stderr // hello from stdout // hello from stderr // hello from stdout // hello from stderr // hello from stdout // hello from stderr // error from daemon in stream: something went wrong }