diff options
| author | Ian Lance Taylor <iant@golang.org> | 2025-02-19 17:37:49 -0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-02-20 09:20:38 -0800 |
| commit | 0de8fc852704d672e3379b05d617ce75dc0b2613 (patch) | |
| tree | 88ffe5d8c2319d0158567624866b1f81be683016 /src/os/exec/exec_posix_test.go | |
| parent | 458ac1b01590506891b2ad2b300ead76aaa4e119 (diff) | |
| download | go-0de8fc852704d672e3379b05d617ce75dc0b2613.tar.xz | |
syscall: don't send child signal when testing pidfd
Avoid a spurious SIGCHLD the first time we start a process.
Fixes #71828
Change-Id: I744100d21bf6aaaaafc99bc5eec9f9f807a50682
Reviewed-on: https://go-review.googlesource.com/c/go/+/650835
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/os/exec/exec_posix_test.go')
| -rw-r--r-- | src/os/exec/exec_posix_test.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/os/exec/exec_posix_test.go b/src/os/exec/exec_posix_test.go index 45604203dd..77c5fc11e4 100644 --- a/src/os/exec/exec_posix_test.go +++ b/src/os/exec/exec_posix_test.go @@ -11,12 +11,15 @@ import ( "internal/testenv" "io" "os" + "os/exec" + "os/signal" "os/user" "path/filepath" "runtime" "slices" "strconv" "strings" + "sync" "syscall" "testing" "time" @@ -24,6 +27,7 @@ import ( func init() { registerHelperCommand("pwd", cmdPwd) + registerHelperCommand("signaltest", cmdSignalTest) } func cmdPwd(...string) { @@ -274,3 +278,55 @@ func TestExplicitPWD(t *testing.T) { }) } } + +// Issue 71828. +func TestSIGCHLD(t *testing.T) { + cmd := helperCommand(t, "signaltest") + out, err := cmd.CombinedOutput() + t.Logf("%s", out) + if err != nil { + t.Error(err) + } +} + +// cmdSignaltest is for TestSIGCHLD. +// This runs in a separate process because the bug only happened +// the first time that a child process was started. +func cmdSignalTest(...string) { + chSig := make(chan os.Signal, 1) + signal.Notify(chSig, syscall.SIGCHLD) + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + c := 0 + for range chSig { + c++ + fmt.Printf("SIGCHLD %d\n", c) + if c > 1 { + fmt.Println("too many SIGCHLD signals") + os.Exit(1) + } + } + }() + defer func() { + signal.Reset(syscall.SIGCHLD) + close(chSig) + wg.Wait() + }() + + exe, err := os.Executable() + if err != nil { + fmt.Printf("os.Executable failed: %v\n", err) + os.Exit(1) + } + + cmd := exec.Command(exe, "hang", "200ms") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + fmt.Printf("failed to run child process: %v\n", err) + os.Exit(1) + } +} |
