t.Errorf("got %v; expected SIGTERM", ee)
}
}
+
+func TestSignalIgnoreSIGTRAP(t *testing.T) {
+ output := runTestProg(t, "testprognet", "SignalIgnoreSIGTRAP")
+ want := "OK\n"
+ if output != want {
+ t.Fatalf("want %s, got %s\n", want, output)
+ }
+}
}
}
+ if c.sigcode() == _SI_USER && signal_ignored(sig) {
+ return
+ }
+
if flags&_SigKill != 0 {
dieFromSignal(int32(sig))
}
}
}
+ if c.sigcode() == _SI_USER && signal_ignored(sig) {
+ return
+ }
+
if flags&_SigKill != 0 {
dieFromSignal(int32(sig))
}
}
}
+ if c.sigcode() == _SI_USER && signal_ignored(sig) {
+ return
+ }
+
if flags&_SigKill != 0 {
dieFromSignal(int32(sig))
}
}
}
+ if c.sigcode() == _SI_USER && signal_ignored(sig) {
+ return
+ }
+
if flags&_SigKill != 0 {
dieFromSignal(int32(sig))
}
}
}
+ if c.sigcode() == _SI_USER && signal_ignored(sig) {
+ return
+ }
+
if flags&_SigKill != 0 {
dieFromSignal(int32(sig))
}
}
}
+ if c.sigcode() == _SI_USER && signal_ignored(sig) {
+ return
+ }
+
if flags&_SigKill != 0 {
dieFromSignal(int32(sig))
}
)
var sig struct {
- note note
- mask [(_NSIG + 31) / 32]uint32
- wanted [(_NSIG + 31) / 32]uint32
- recv [(_NSIG + 31) / 32]uint32
- state uint32
- inuse bool
+ note note
+ mask [(_NSIG + 31) / 32]uint32
+ wanted [(_NSIG + 31) / 32]uint32
+ ignored [(_NSIG + 31) / 32]uint32
+ recv [(_NSIG + 31) / 32]uint32
+ state uint32
+ inuse bool
}
const (
return
}
sig.wanted[s/32] |= 1 << (s & 31)
+ sig.ignored[s/32] &^= 1 << (s & 31)
sigenable(s)
}
return
}
sig.wanted[s/32] &^= 1 << (s & 31)
+ sig.ignored[s/32] |= 1 << (s & 31)
sigignore(s)
}
+// Checked by signal handlers.
+func signal_ignored(s uint32) bool {
+ return sig.ignored[s/32]&(1<<(s&31)) != 0
+}
+
// This runs on a foreign stack, without an m or a g. No stack split.
//go:nosplit
//go:norace
--- /dev/null
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !windows,!plan9,!nacl
+
+// This is in testprognet instead of testprog because testprog
+// must not import anything (like net, but also like os/signal)
+// that kicks off background goroutines during init.
+
+package main
+
+import (
+ "os/signal"
+ "syscall"
+)
+
+func init() {
+ register("SignalIgnoreSIGTRAP", SignalIgnoreSIGTRAP)
+}
+
+func SignalIgnoreSIGTRAP() {
+ signal.Ignore(syscall.SIGTRAP)
+ syscall.Kill(syscall.Getpid(), syscall.SIGTRAP)
+ println("OK")
+}