I hope this isn't a red herring but in constructing a self-contained
example I triggered a deadlock. Perhaps the deadlock is the answer to my
question or perhaps it is another issue. Either way this code does not seem
malformed:

func main() {

cmdName := "/bin/bash"
cmdArgs := []string{

"-c",

"while true; do echo step; sleep 1; done",

}
cmdStdinR, cmdStdinW := io.Pipe()
cmdStdoutR, cmdStdoutW := io.Pipe()
cmdStderrR, cmdStderrW := io.Pipe()
ctx, cancelCmd := context.WithCancel(context.Background())
cmd := exec.CommandContext(ctx, cmdName, cmdArgs...)
cmd.Stdin = cmdStdinR
cmd.Stdout = cmdStdoutW
cmd.Stderr = cmdStderrW

if err := cmd.Start(); err != nil {

fmt.Println(err)

}

cmdStdinW.Close()
if err := cmd.Wait(); err != nil {

fmt.Println(err)

}

fmt.Println("DONE")

cancelCmd = cancelCmd
cmdStdoutR = cmdStdoutR
cmdStderrR = cmdStderrR

}

If you run this code and SIGKILL the bash process, go flags it as a
deadlock and panics. FWIW, this also happens if there are goroutines
monitoring cmdStdoutR and cmdStderrR.

What am I missing?

-- Salvatore
smile.

-- 
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/CAEQs7S9mhLm7FZrKHoHuQUDk4BVk3ypFJVcCE%3D32y2-AMgwYWA%40mail.gmail.com.

Reply via email to