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. |