From: Russ Cox Date: Thu, 7 Jan 2021 16:21:37 +0000 (-0500) Subject: cmd/go: pass signals forward during "go tool" X-Git-Tag: go1.16rc1~99 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6728118e0ae2658e758a64fe86e2e1a3aa55268c;p=gostls13.git cmd/go: pass signals forward during "go tool" This way, if a SIGINT is sent to the go command, it is forwarded on to the underlying tool. Otherwise trying to use os.Process.Signal to kill "go tool compile" only kills the "go tool" not the "compile". Change-Id: Iac7cd4f06096469f5e76164df813a379c0da3822 Reviewed-on: https://go-review.googlesource.com/c/go/+/282312 Trust: Russ Cox Run-TryBot: Russ Cox TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Reviewed-by: Matthew Dempsky --- diff --git a/src/cmd/go/internal/tool/tool.go b/src/cmd/go/internal/tool/tool.go index 7f4dc86802..6a755bc436 100644 --- a/src/cmd/go/internal/tool/tool.go +++ b/src/cmd/go/internal/tool/tool.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "os/exec" + "os/signal" "sort" "strings" @@ -85,7 +86,19 @@ func runTool(ctx context.Context, cmd *base.Command, args []string) { Stdout: os.Stdout, Stderr: os.Stderr, } - err := toolCmd.Run() + err := toolCmd.Start() + if err == nil { + c := make(chan os.Signal, 100) + signal.Notify(c) + go func() { + for sig := range c { + toolCmd.Process.Signal(sig) + } + }() + err = toolCmd.Wait() + signal.Stop(c) + close(c) + } if err != nil { // Only print about the exit status if the command // didn't even run (not an ExitError) or it didn't exit cleanly