golang 使用unix signal

344 阅读2分钟

Unix Signal

Signal发送给进程的软中断信号,中断信号表示重要的事件发生。

下面列出一些常用的Signal,可能在日常shell开发中用到:

Signal NameSignal NumberDescription
SIGHUP1Hang up detected on controlling terminal or death of controlling process
SIGINT2Issued if the user sends an interrupt signal (Ctrl + C)
SIGQUIT3Issued if the user sends a quit signal (Ctrl + D)
SIGFPE8Issued if an illegal mathematical operation is attempted
SIGKILL9If a process gets this signal it must quit immediately and will not perform any clean-up operations
SIGALRM14Alarm clock signal (used for timers)
SIGTERM15Software termination signal (sent by kill by default)

列出全部的信号:

$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

golang signal

notify

golang中Notify(c chan<- os.Signal, sig ...os.Signal)方法会将系统的信号转发到Channel参数c中。后面如果指定了信号类型数组,则只转发数组内类型的信号; 否则全部转发。

package main

import (
	"fmt"
	"os"
	"os/signal"
)

func main() {

	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt)
	 s := <-c    // Block until a signal is received.
	 fmt.Println("Got signal:", s)
}

这个程序会一直阻塞,直到系统按了Ctrl+C

[root@localhost runcapitest]# go run main.go 
^CGot signal: interrupt

kill -9 pid

package main

import (
	"errors"
	"golang.org/x/sys/unix"
	"os"
)

func main() {

	signal(13867,unix.SIGKILL)
}
# kill process by id
func signal(pid int,sig os.Signal) error {
	s, ok := sig.(unix.Signal)
	if !ok {
		return errors.New("os: unsupported signal type")
	}
	return unix.Kill(pid, s)
}

Reference List

  1. signal(7) man page