目录

信号类型

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 信号处理相关推荐

  1. c语言线程唤醒signal,多线程编程与signal信号处理

    对于多线程编程时候,对于signal传递的信号处理函数对于各个线程是共享的,虽然各个线程可以设置自己的屏蔽字.如下面所示代码.两个线程中,每个线程有一个signal接受信号,但是实际上执行时每个线程会 ...

  2. Go Signal信号处理

    前言 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方式.对于Linux系统来说,信号就是软中断,用来通知进程发生了异步事件. 当信号发送到某个进程 ...

  3. golang signal 信号简介

    目录 1.1. 基本概念 1.2. Go 对信号的处理 1.2.1. Go 程序对信号的默认行为 1.2.2. 改变信号的默认行为 1.2.3. SIGPIPE 1.2.4. cgo 注意事项 1.3 ...

  4. 嵌入式Linux系统编程学习之十四signal信号处理机制

      可以用函数 signal 注册一个信号处理函数,原型为: #include <signal.h>typedef void(*sighandler_t)(int); //函数指针 voi ...

  5. Signal信号处理

    在goahead的linux模块main.c 文件中,main函数中出现了以下三个语句: signal(SIGPIPE, SIG_IGN);   signal(SIGINT, sigintHandle ...

  6. scipy.signal信号处理的库(笔记06)

    信号处理(scipy.signal) 网址:https://docs.scipy.org/doc/scipy/reference/signal.html#scipy.signal 卷积 convolv ...

  7. 如何在GDB中忽略Signal信号处理

    在使用GDB调试C/C++程序时,如果刚好程序中需要对特殊Signal处理,则在调试这类应用时需要GDB忽略对该Signal的处理.本文来自GBD官方文档的翻译,仅供参考. 信号(Signals) 信 ...

  8. Python signal 信号处理模块

    Table of Contents 1. signal模块简介 1.1. signal简单示例 1.2. signal说明 1.2.1. 基本的信号名 1.2.2. 常用信号处理函数 2. signa ...

  9. golang 消息忽略 signal.Ignore(syscall.SIGHUP) 示例

    目录 示例1: exec.Command 子进程调用 忽略消息 防止僵尸进程 示例2:管道调用中的 消息忽略 示例3:多个消息忽略 示例4:消息忽略 与 消息处理 同存 消息具体含义参考: <g ...

最新文章

  1. 【PHP】关于IPv4、IPv6 的操作函数
  2. 从 RxJS 到 Flink:如何处理数据流?
  3. CodeForces 651B
  4. schema约束文档与xml文件详解
  5. angular-数据绑定的最佳实践
  6. swift linux服务器,Swift on Linux —— Hello, world!
  7. 整数转字符串,字符串转整数
  8. 智能控制导论 # 模糊控制 2 模糊控制器的原理与设计方法
  9. CUDA10,Torch安装解决NOTFOUND CUDA_cublas_device_LIBRARY,Ubuntu16.04安装torch遇到的错误
  10. 云计算网络产品sdn以及VxLAN技术浅析
  11. 蓝牙 - 被高通收购的CSR的一颗蓝牙芯片
  12. 网络安全-点击劫持(ClickJacking)的原理、攻击及防御
  13. 另眼看待 qq 和 360. 资本运作
  14. selenium tbody表单获取封装函数
  15. 我不是蓝牙大神,但还是斗胆对蓝牙学习路线给点建议!
  16. iQOO探索悦行者深入阿尔山林海体验性能和操控激情
  17. CCF201712-4 行车路线(最短路)
  18. windows批处理bat脚本技巧
  19. 诺基亚狙击华为起诉T-Mobile的背后
  20. python+selenium自动化软件测试(第3章):unittest

热门文章

  1. 有一种爱,永远也无法逾越
  2. 火力发电厂与变电站设计防火规范_建筑内部装修设计防火规范-GB 50222-2017
  3. 互联网协议 — RIP 路由信息协议
  4. Linux Kernel TCP/IP Stack — L2 Layer
  5. Linux_LAMP 最强大的动态网站解决方案
  6. Swt/Jface中提供的dialog
  7. 自定义Unity 容器的扩展 --- Unity Application Block Event Broker
  8. MYSQL一主多从配置
  9. 【斗医】【13】Web应用开发20天
  10. 第七章 培养负责的习惯