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