gopkg.in/essentialkaos/ek.v3@v3.5.1/signal/signal.go (about)

     1  // +build !windows
     2  
     3  // Package signal provides methods for handling signals
     4  package signal
     5  
     6  // ////////////////////////////////////////////////////////////////////////////////// //
     7  //                                                                                    //
     8  //                     Copyright (c) 2009-2016 Essential Kaos                         //
     9  //      Essential Kaos Open Source License <http://essentialkaos.com/ekol?en>         //
    10  //                                                                                    //
    11  // ////////////////////////////////////////////////////////////////////////////////// //
    12  
    13  import (
    14  	"os"
    15  	"os/signal"
    16  	"syscall"
    17  )
    18  
    19  // ////////////////////////////////////////////////////////////////////////////////// //
    20  
    21  // Signal codes
    22  const (
    23  	ABRT   = syscall.SIGABRT
    24  	ALRM   = syscall.SIGALRM
    25  	BUS    = syscall.SIGBUS
    26  	CHLD   = syscall.SIGCHLD
    27  	CONT   = syscall.SIGCONT
    28  	FPE    = syscall.SIGFPE
    29  	HUP    = syscall.SIGHUP
    30  	ILL    = syscall.SIGILL
    31  	INT    = syscall.SIGINT
    32  	IO     = syscall.SIGIO
    33  	IOT    = syscall.SIGIOT
    34  	KILL   = syscall.SIGKILL
    35  	PIPE   = syscall.SIGPIPE
    36  	PROF   = syscall.SIGPROF
    37  	QUIT   = syscall.SIGQUIT
    38  	SEGV   = syscall.SIGSEGV
    39  	STOP   = syscall.SIGSTOP
    40  	SYS    = syscall.SIGSYS
    41  	TERM   = syscall.SIGTERM
    42  	TRAP   = syscall.SIGTRAP
    43  	TSTP   = syscall.SIGTSTP
    44  	TTIN   = syscall.SIGTTIN
    45  	TTOU   = syscall.SIGTTOU
    46  	URG    = syscall.SIGURG
    47  	USR1   = syscall.SIGUSR1
    48  	USR2   = syscall.SIGUSR2
    49  	VTALRM = syscall.SIGVTALRM
    50  	WINCH  = syscall.SIGWINCH
    51  	XCPU   = syscall.SIGXCPU
    52  	XFSZ   = syscall.SIGXFSZ
    53  )
    54  
    55  // ////////////////////////////////////////////////////////////////////////////////// //
    56  
    57  // Handlers is map signal->handler
    58  type Handlers map[os.Signal]func()
    59  
    60  // ////////////////////////////////////////////////////////////////////////////////// //
    61  
    62  // Send send given signal to process
    63  func Send(pid int, signal syscall.Signal) error {
    64  	return syscall.Kill(pid, signal)
    65  }
    66  
    67  // ////////////////////////////////////////////////////////////////////////////////// //
    68  
    69  // Track catch signal and execute handler for this signal
    70  func (h Handlers) Track() {
    71  	c := make(chan os.Signal)
    72  
    73  	for s := range h {
    74  		signal.Notify(c, s)
    75  	}
    76  
    77  	go func() {
    78  		for {
    79  			sig := <-c
    80  
    81  			handler := h[sig]
    82  
    83  			if handler != nil {
    84  				handler()
    85  			}
    86  		}
    87  	}()
    88  }
    89  
    90  // TrackAsync catch signal and execute async handler for this signal
    91  func (h Handlers) TrackAsync() {
    92  	c := make(chan os.Signal)
    93  
    94  	for s := range h {
    95  		signal.Notify(c, s)
    96  	}
    97  
    98  	go func() {
    99  		for {
   100  			sig := <-c
   101  
   102  			handler := h[sig]
   103  
   104  			if handler != nil {
   105  				go handler()
   106  			}
   107  		}
   108  	}()
   109  }
   110  
   111  // ////////////////////////////////////////////////////////////////////////////////// //