Documentation ¶
Index ¶
- func DumpPreviousStacktrace()
- func DumpSignalTo(fd int)
- func DumpStacktraceTo(name string)
- func Notify(c chan<- os.Signal, sigs ...os.Signal)
- func PreviousStacktrace() string
- func SetSigInvokeChain(to os.Signal, wait os.Signal, sleepInSeconds int, froms ...os.Signal)
- func Signum(sig os.Signal) int
- type OnSignalHandler
- type OnSignalHandlerFunc
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func DumpPreviousStacktrace ¶
func DumpPreviousStacktrace()
DumpPreviousStacktrace dumps the previous human readable stacktrace to fd, which is set by SetSignalDumpToFd.
func DumpSignalTo ¶
func DumpSignalTo(fd int)
DumpSignalTo redirects log to fd, -1 if not set; muted if < 0.
func DumpStacktraceTo ¶
func DumpStacktraceTo(name string)
DumpStacktraceTo set dump file path of stacktrace when signal is triggered "*.stacktrace.dump" under a temp dir if not set.
func Notify ¶
Notify act as signal.Notify, which invokes the Go signal handler. https://godoc.org/os/signal#hdr-Go_programs_that_use_cgo_or_SWIG Notify must be called again when one sig is called on windows system as windows is based on signal(), which will reset sig's handler to SIG_DFL before sig's handler is called While unix-like os will remain sig's handler always.
Example ¶
package main import ( "fmt" "os" "runtime" "sync" "syscall" "time" signal_ "github.com/searKing/golang/go/os/signal" ) func main() { signal_.DumpSignalTo(syscall.Stderr) signal_.SetSigInvokeChain(syscall.SIGUSR1, syscall.SIGUSR2, 0, syscall.SIGINT) // Set up channel on which to send signal notifications. // We must use a buffered channel or risk missing the signal // if we're not ready to receive when the signal is sent. c := make(chan os.Signal, 1) //signal.Notify(c, syscall.SIGINT, syscall.SIGSEGV) signal_.Notify(c, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGINT) // simulate to send a SIGINT to this example test go func() { _ = syscall.Kill(syscall.Getpid(), syscall.SIGINT) }() var wg sync.WaitGroup wg.Add(1) go func() { runtime.LockOSThread() defer runtime.UnlockOSThread() defer wg.Done() for { // Block until a signal is received. select { case s, ok := <-c: if !ok { return } //signal.Stop(c) //close(c) if s == syscall.SIGUSR1 { _, _ = fmt.Fprintf(os.Stderr, "Previous run crashed:\n%s\n", signal_.PreviousStacktrace()) _ = syscall.Kill(syscall.Getpid(), syscall.SIGUSR2) } else if s != syscall.SIGUSR2 { fmt.Printf("Got signal: %s\n", s) // just in case of windows os system, which is based on signal() in C language // you can comment below out on unix-like os system. signal_.Notify(c, s) } if s == syscall.SIGINT { return } case <-time.After(time.Minute): _, _ = fmt.Fprintf(os.Stderr, "time overseed:\n") return } // set os.Stderr to pass test, for the stacktrace is random. // stderr prints something like: // Signal received(2). // Stacktrace dumped to file: stacktrace.dump. // Previous run crashed: // 0# searking::SignalHandler::operator()(int, __siginfo*, void*) in /private/var/folders/12/870qx8rd0_d96nt6g078wp080000gn/T/___ExampleSignalAction_in_github_com_searKing_golang_go_os_signal // 1# _sigtramp in /usr/lib/system/libsystem_platform.dylib } }() wg.Wait() }
Output: Got signal: interrupt
func PreviousStacktrace ¶
func PreviousStacktrace() string
PreviousStacktrace returns a human readable stacktrace
func SetSigInvokeChain ¶
SetSigInvokeChain sets a rule to raise signal to {to} and wait until {wait}, done with sleep {sleepInSeconds}s
Types ¶
type OnSignalHandler ¶
type OnSignalHandlerFunc ¶
func (OnSignalHandlerFunc) OnSignal ¶
func (f OnSignalHandlerFunc) OnSignal(signum os.Signal)
Directories ¶
Path | Synopsis |
---|---|
Package cgo contains runtime support for code generated by the cgo tool.
|
Package cgo contains runtime support for code generated by the cgo tool. |