bcd.go
func Register(t TracerSig) {
	ss := t.Sigset()
	if ss == nil || len(ss) == 0 {
		t.Logf(LogError, "Failed to register signal handler: empty "+
			"sigset\n")
		return
	}

	c := t.Sigchan()
	if c != nil {
		unregisterInternal(t, c)
	}

	c = make(chan os.Signal, len(ss))
	t.SetSigchan(c)

	signal.Notify(c, ss...)

	t.Logf(LogDebug, "Registered tracer %s (signal set: %v)\n", t, ss)

	state.m.RLock()
	rs := state.c.ResendSignal
	state.m.RUnlock()

	go func(t TracerSig) {
		for s := range c {
			t.Logf(LogDebug, "Received %v; executing tracer\n", s)

			Trace(t, &signalError{s}, nil)

			if !rs {
				continue
			}

			t.Logf(LogDebug, "Resending %v to default handler\n", s)

			// Re-handle the signal with the default Go behavior.
			signal.Reset(s)
			p, err := os.FindProcess(os.Getpid())
			if err != nil {
				t.Logf(LogError, "Failed to resend signal: "+
					"cannot find process object")
				return
			}

			p.Signal(s)
		}

		t.Logf(LogDebug, "Signal channel closed; exiting goroutine\n")
	}(t)

	return
}
func Register(t TracerSig) {
	ss := t.Sigset()
	if ss == nil || len(ss) == 0 {
		t.Logf(LogError, "Failed to register signal handler: empty "+
			"sigset\n")
		return
	}

	c := t.Sigchan()
	if c != nil {
		unregisterInternal(t, c)
	}

	c = make(chan os.Signal, len(ss))
	t.SetSigchan(c)

	signal.Notify(c, ss...)

	t.Logf(LogDebug, "Registered tracer %s (signal set: %v)\n", t, ss)

	state.m.RLock()
	rs := state.c.ResendSignal
	state.m.RUnlock()

	go func(t TracerSig) {
		for s := range c {
			t.Logf(LogDebug, "Received %v; executing tracer\n", s)

			Trace(t, &signalError{s}, nil)

			if !rs {
				continue
			}

			t.Logf(LogDebug, "Resending %v to default handler\n", s)

			// Re-handle the signal with the default Go behavior.
			signal.Reset(s)
			p, err := os.FindProcess(os.Getpid())
			if err != nil {
				t.Logf(LogError, "Failed to resend signal: "+
					"cannot find process object")
				return
			}

			p.Signal(s)
		}

		t.Logf(LogDebug, "Signal channel closed; exiting goroutine\n")
	}(t)

	return
}
func Register ( t TracerSig ) { ss := t . Sigset ( ) if ss == nil || len ( ss ) == 0 { t . Logf ( LogError , " " + " \n " ) return } c := t . Sigchan ( ) if c != nil { unregisterInternal ( t , c ) } c = make ( chan os . Signal , len ( ss ) ) t . SetSigchan ( c ) signal . Notify ( c , ss ... ) t . Logf ( LogDebug , " \n " , t , ss ) state . m . RLock ( ) rs := state . c . ResendSignal state . m . RUnlock ( ) go func ( t TracerSig ) { for s := range c { t . Logf ( LogDebug , " \n " , s ) Trace ( t , & signalError { s } , nil ) if ! rs { continue } t . Logf ( LogDebug , " \n " , s ) // Re-handle the signal with the default Go behavior. signal . Reset ( s ) p , err := os . FindProcess ( os . Getpid ( ) ) if err != nil { t . Logf ( LogError , " " + " " ) return } p . Signal ( s ) } t . Logf ( LogDebug , " \n " ) } ( t ) return }
// Registers a signal handler to execute the specified Tracer upon receipt of
// any signal in the set specified by TracerSig.Sigset().
// If the GlobalConfiguration value ResendSignal is true, then when a signal is
// received through this handler, all handlers for that signal will be reset
// with signal.Reset(s) after tracer execution completes. The signal will then
// be resent to the default Go handler for that signal.
Registers a signal handler to execute the specified Tracer upon receipt of any signal in the set specified by TracerSig . Sigset () . If the GlobalConfiguration value ResendSignal is true then when a signal is received through this handler all handlers for that signal will be reset with signal . Reset ( s ) after tracer execution completes . The signal will then be resent to the default Go handler for that signal .