golangossignal阅读

4次阅读

共计 1249 个字符,预计需要花费 4 分钟才能阅读完成。

golang(os/signal)阅读
信号和信号函数
在 unix-like 系统中,我们要经常用到信号和信号处理函数。我们在 linux 编程中,经常要处理程序接收到的函数。比如:

signal(SIGINT, SignalHandler)
上面的函数注册 SIGINT 的信号处理函数 SignalHandler,当程序运行中,当收到 SIGINT 信号,程序相应的执行 SignalHandler 函数。

信号的分类
特殊信号
SIGKILL 和 SIGSTOP 不能被程序修改。

SIGKILL 杀死一个程序
SIGSTOP 暂停一个程序
// 运行一个程序
for {

    time.Sleep(1 * time.Second)
}

// 程序是个死循环
// 使用 SIGINT 退出
^Csignal: interrupt
// 程序退出
// 忽略 SIGINT,SIGSTOP 和 SIGKILL
signal.Ignore(syscall.SIGKILL, syscall.SIGINT, syscall.SIGSTOP)
//SIGINT ^C
//SIGSTOP
[3] + 25295 suspended go run non-caught-signal.go
//SIGKILL
mchen 25413 25295 0 06:04 pts/5 00:00:00 [non-caught-sign] <defunct>
同步信号
同步信号是程序运行期间发生错误触发的信号。

SIGBUS 意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。
SIGFPE 是当一个进程执行了一个错误的算术操作时发送给它的信号。
SIGSEGV 味着指针所对应的地址是无效地址,没有物理内存对 应该地址。
Note:go 程序碰到此类信号,go 程序会进入 panic。

异步信号
kernel 或者其他程序发送给此程序的信号是异步信号。几个示例信号:

SIGHUP 程序丢失终端
SIGINT 在程序执行期间,交互终端按下 CTRL+C
SIGQUIT 在程序执行期间,交换终端键盘按下 CTRL+/
go 语言对信号的处理
go 信号的默认行为
同步信号会引发 panic
SIGHUP,SIGINT,SIGTERM 程序退出
SIGQUIT,SIGILL,SIGTRAP,SIGABRT,SIGSTEFLT,SIGSYS 程序退出,并且 dump 出栈信息
SIGTSTP,SIGTTIN,SIGTTOU 获取系统默认行为
SIGPROF 性能测试用
改变信号的默认处理函数
func Ignore(sig …os.Signal) 忽略某些信号,相当于 C 函数 signal(sig, SIG_IGN) func Ignored(sig os.Signal) bool 判断某个信号是否是被忽悠的 func Notify(c chan<-, sig …os.Signal)

收到的信号,发往 channel c

c 必须有足够的缓存来储存信号,也就是 buffer channel

一个处理一个信号的 c,可以设置 buffer 为 1

可以调用 notify 多次设置多个 channel,接收同一信号。

清空 notify 使用 Stop

正文完
 0