On Sat, Dec 14, 2019 at 7:40 PM <tomas.v...@showmax.com> wrote:
>
> I need to spawn a subprocess and I'm trying to use os/exec. I need to capture
> stdout/err so I'm using Cmd.StdoutPipe and Cmd.StderrPipe . The problem I'm
> having is how to correctly clean up the pipes after I am done. If Cmd.Start
> works fine, all I need to do is read everything and then call Cmd.Wait, which
> states that it will clean up ( https://golang.org/pkg/os/exec/#Cmd.Wait ):
>
> > Wait releases any resources associated with the Cmd.
>
> However, what I am not sure about is how to handle cases when Cmd.Start 
> returns
> an error. Nowhere in its documentation it's said that it cleans up the
> resources, so originally I thought I have to do the cleanup myself. However,
> after checking the source code it does seem to close the pipes when it fails:
>
> https://golang.org/src/os/exec/exec.go?s=11462:11489#L374
>
> And now I'm not sure what to do. io.Closer states that double-close is no-no:
>
> > The behavior of Close after the first call is undefined.
>
> so I cannot even close them myself (since they will be already closed). It 
> seems
> I have to rely on undocumented behaviour, but those have tendency to change 
> and
> I don't want to start leaking file descriptors after patch version update... I
> assume there must be a way to solve this using just documented behaviour. Can
> someone point me in a right direction?
>
>
>
> Maybe to better show my problem, here it's in pseudo code (error handling
> omitted):
>
>         cmd := exec.Command(name, args...)
>         stdout, _ := cmd.StdoutPipe()
>         stderr, _ := cmd.StderrPipe()
>         if err := cmd.Start(); err != nil {
>                 // --> How should I close stdout/stderr here to future-proof 
> for
>                 //     changes in cmd.Start behavior?
>                 return err
>         }
>         consumeAll(stdout)
>         consumeAll(stderr)
>         cmd.Wait()
>         return nil


If Start returns an error, the read and write ends of the pipes will
be closed just as though Wait returned.   You don't have to close
anything yourself if Start fails.  I agree that this should be
documented.

Ian

-- 
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/CAOyqgcXxwLShhtV-N7tUve7d5ni1ekZsMeGdnS4vOcveKrHUvA%40mail.gmail.com.

Reply via email to