golang signal 信号处理
目录
信号类型
golang 信号发送和处理
信号类型
个平台的信号定义或许有些不同。下面列出了POSIX中定义的信号。
Linux 使用34-64信号用作实时系统中。
命令 man signal 提供了官方的信号介绍。
在POSIX.1-1990标准中定义的信号列表
信号 | 值 | 动作 | 说明 |
---|---|---|---|
SIGHUP | 1 | Term | 终端控制进程结束(终端连接断开) |
SIGINT | 2 | Term | 用户发送INTR字符(Ctrl+C)触发 |
SIGQUIT | 3 | Core | 用户发送QUIT字符(Ctrl+/)触发 |
SIGILL | 4 | Core | 非法指令(程序错误、试图执行数据段、栈溢出等) |
SIGABRT | 6 | Core | 调用abort函数触发 |
SIGFPE | 8 | Core | 算术运行错误(浮点运算错误、除数为零等) |
SIGKILL | 9 | Term | 无条件结束程序(不能被捕获、阻塞或忽略) |
SIGSEGV | 11 | Core | 无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作) |
SIGPIPE | 13 | Term | 消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作) |
SIGALRM | 14 | Term | 时钟定时信号 |
SIGTERM | 15 | Term | 结束程序(可以被捕获、阻塞或忽略) |
SIGUSR1 | 30,10,16 | Term | 用户保留 |
SIGUSR2 | 31,12,17 | Term | 用户保留 |
SIGCHLD | 20,17,18 | Ign | 子进程结束(由父进程接收) |
SIGCONT | 19,18,25 | Cont | 继续执行已经停止的进程(不能被阻塞) |
SIGSTOP | 17,19,23 | Stop | 停止进程(不能被捕获、阻塞或忽略) |
SIGTSTP | 18,20,24 | Stop | 停止进程(可以被捕获、阻塞或忽略) |
SIGTTIN | 21,21,26 | Stop | 后台程序从终端中读取数据时触发 |
SIGTTOU | 22,22,27 | Stop | 后台程序向终端中写数据时触发 |
在SUSv2和POSIX.1-2001标准中的信号列表:
第1列为信号名;
第2列为对应的信号值,需要注意的是,有些信号名对应着3个信号值,这是因为这些信号值与平台相关,将man手册中对3个信号值的说明摘出如下,the first one is usually valid for alpha and sparc, the middle one for i386, ppc and sh, and the last one for mips.
第3列为操作系统收到信号后的动作,Term表明默认动作为终止进程,Ign表明默认动作为忽略该信号,Core表明默认动作为终止进程同时输出core dump,Stop表明默认动作为停止进程。
第4列为对信号作用的注释性说明,浅显易懂,这里不再赘述。
需要特别说明的是,SIGKILL和SIGSTOP这两个信号既不能被应用程序捕获,也不能被操作系统阻塞或忽略。
第1列为信号名;
第2列为对应的信号值,需要注意的是,有些信号名对应着3个信号值,这是因为这些信号值与平台相关,将man手册中对3个信号值的说明摘出如下,the first one is usually valid for alpha and sparc, the middle one for i386, ppc and sh, and the last one for mips.
第3列为操作系统收到信号后的动作,Term表明默认动作为终止进程,Ign表明默认动作为忽略该信号,Core表明默认动作为终止进程同时输出core dump,Stop表明默认动作为停止进程。
第4列为对信号作用的注释性说明,浅显易懂,这里不再赘述。
需要特别说明的是,SIGKILL和SIGSTOP这两个信号既不能被应用程序捕获,也不能被操作系统阻塞或忽略。
golang 信号发送和处理
- golang中对信号的处理主要使用os/signal包中的两个方法:
- notify方法用来监听收到的信号
- stop方法用来取消监听
1.监听全部信号
package mainimport ("fmt""os""os/signal"
)// 监听全部信号
func main() {//合建chanc := make(chan os.Signal)//监听所有信号signal.Notify(c)//阻塞直到有信号传入fmt.Println("启动")s := <-cfmt.Println("退出信号", s)
}
启动
go run example-1.go
启动ctrl+c退出,输出
退出信号 interruptkill pid 输出
退出信号 terminated
2.监听指定信号
package mainimport ("fmt""os""os/signal""syscall"
)// 监听指定信号
func main() {//合建chanc := make(chan os.Signal)//监听指定信号 ctrl+c killsignal.Notify(c, os.Interrupt, os.Kill, syscall.SIGUSR1, syscall.SIGUSR2)//阻塞直到有信号传入fmt.Println("启动")//阻塞直至有信号传入s := <-cfmt.Println("退出信号", s)
}
启动
go run example-2.go
启动ctrl+c退出,输出
退出信号 interruptkill pid 输出
退出信号 terminatedkill -USR1 pid 输出
退出信号 user defined signal 1kill -USR2 pid 输出
退出信号 user defined signal 2
3.优雅退出go守护进程
package mainimport ("fmt""os""os/signal""syscall""time"
)// 优雅退出go守护进程
func main() {//创建监听退出chanc := make(chan os.Signal)//监听指定信号 ctrl+c killsignal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)go func() {for s := range c {switch s {case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:fmt.Println("退出", s)ExitFunc()case syscall.SIGUSR1:fmt.Println("usr1", s)case syscall.SIGUSR2:fmt.Println("usr2", s)default:fmt.Println("other", s)}}}()fmt.Println("进程启动...")sum := 0for {sum++fmt.Println("sum:", sum)time.Sleep(time.Second)}
}func ExitFunc() {fmt.Println("开始退出...")fmt.Println("执行清理...")fmt.Println("结束退出...")os.Exit(0)
}
kill -USR1 pid 输出
usr1 user defined signal 1kill -USR2 pid
usr2 user defined signal 2kill pid
退出 terminated
开始退出...
执行清理...
结束退出...
执行输出
go run example-3.go
进程启动...
sum: 1
sum: 2
sum: 3
sum: 4
sum: 5
sum: 6
sum: 7
sum: 8
sum: 9
usr1 user defined signal 1
sum: 10
sum: 11
sum: 12
sum: 13
sum: 14
usr2 user defined signal 2
sum: 15
sum: 16
sum: 17
退出 terminated
开始退出...
执行清理...
结束退出...
golang signal 信号处理相关推荐
- c语言线程唤醒signal,多线程编程与signal信号处理
对于多线程编程时候,对于signal传递的信号处理函数对于各个线程是共享的,虽然各个线程可以设置自己的屏蔽字.如下面所示代码.两个线程中,每个线程有一个signal接受信号,但是实际上执行时每个线程会 ...
- Go Signal信号处理
前言 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方式.对于Linux系统来说,信号就是软中断,用来通知进程发生了异步事件. 当信号发送到某个进程 ...
- golang signal 信号简介
目录 1.1. 基本概念 1.2. Go 对信号的处理 1.2.1. Go 程序对信号的默认行为 1.2.2. 改变信号的默认行为 1.2.3. SIGPIPE 1.2.4. cgo 注意事项 1.3 ...
- 嵌入式Linux系统编程学习之十四signal信号处理机制
可以用函数 signal 注册一个信号处理函数,原型为: #include <signal.h>typedef void(*sighandler_t)(int); //函数指针 voi ...
- Signal信号处理
在goahead的linux模块main.c 文件中,main函数中出现了以下三个语句: signal(SIGPIPE, SIG_IGN); signal(SIGINT, sigintHandle ...
- scipy.signal信号处理的库(笔记06)
信号处理(scipy.signal) 网址:https://docs.scipy.org/doc/scipy/reference/signal.html#scipy.signal 卷积 convolv ...
- 如何在GDB中忽略Signal信号处理
在使用GDB调试C/C++程序时,如果刚好程序中需要对特殊Signal处理,则在调试这类应用时需要GDB忽略对该Signal的处理.本文来自GBD官方文档的翻译,仅供参考. 信号(Signals) 信 ...
- Python signal 信号处理模块
Table of Contents 1. signal模块简介 1.1. signal简单示例 1.2. signal说明 1.2.1. 基本的信号名 1.2.2. 常用信号处理函数 2. signa ...
- golang 消息忽略 signal.Ignore(syscall.SIGHUP) 示例
目录 示例1: exec.Command 子进程调用 忽略消息 防止僵尸进程 示例2:管道调用中的 消息忽略 示例3:多个消息忽略 示例4:消息忽略 与 消息处理 同存 消息具体含义参考: <g ...
最新文章
- 【PHP】关于IPv4、IPv6 的操作函数
- 从 RxJS 到 Flink:如何处理数据流?
- CodeForces 651B
- schema约束文档与xml文件详解
- angular-数据绑定的最佳实践
- swift linux服务器,Swift on Linux —— Hello, world!
- 整数转字符串,字符串转整数
- 智能控制导论 # 模糊控制 2 模糊控制器的原理与设计方法
- CUDA10,Torch安装解决NOTFOUND CUDA_cublas_device_LIBRARY,Ubuntu16.04安装torch遇到的错误
- 云计算网络产品sdn以及VxLAN技术浅析
- 蓝牙 - 被高通收购的CSR的一颗蓝牙芯片
- 网络安全-点击劫持(ClickJacking)的原理、攻击及防御
- 另眼看待 qq 和 360. 资本运作
- selenium tbody表单获取封装函数
- 我不是蓝牙大神,但还是斗胆对蓝牙学习路线给点建议!
- iQOO探索悦行者深入阿尔山林海体验性能和操控激情
- CCF201712-4 行车路线(最短路)
- windows批处理bat脚本技巧
- 诺基亚狙击华为起诉T-Mobile的背后
- python+selenium自动化软件测试(第3章):unittest