golang中的信号
列出信号
发送信号
kill -SIGKILL PID
信号处理
- 通过kill命令给正在运行的程序发送信号
- 不处理的话,程序会panic处理
Signal handler可以通过signal()
系统调用进行设置。如果没有设置,缺省的handler会被调用,当然进程也可以设置忽略此信号。
有两种信号不能被拦截和处理:SIGKILL
和SIGSTOP
当接收到信号时,进程会根据信号的响应动作执行相应的操作,信号的响应动作有以下几种:
- 中止进程(Term)
- 忽略信号(Ign)
- 中止进程并保存内存信息(Core)
- 停止进程(Stop)
- 继续运行进程(Cont)
用户可以通过signal
或sigaction
函数修改信号的响应动作(也就是常说的“注册信号”)。另外,在多线程中,各线程的信号响应动作都是相同的,不能对某个线程设置独立的响应动作。
信号介绍
- Ctrl-C 发送 INT signal (SIGINT),通常导致进程结束
- Ctrl-Z 发送 TSTP signal (SIGTSTP); 通常导致进程挂起(suspend)
- Ctrl-\ 发送 QUIT signal (SIGQUIT); 通常导致进程结束 和 dump core.
- Ctrl-T (不是所有的UNIX都支持) 发送INFO signal (SIGINFO); 导致操作系统显示此运行命令的信息
个平台的信号定义或许有些不同。下面列出了POSIX中定义的信号。
Linux 使用34-64信号用作实时系统中。
命令man 7 signal
提供了官方的信号介绍。
在POSIX.1-1990标准中定义的信号列表
信号处理
package mainimport "fmt"
import "os"
import "os/signal"
import "syscall"func main() {// Go信号通知通过向一个channel发送``os.Signal`来实现。// 我们将创建一个channel来接受这些通知,同时我们还用// 一个channel来在程序可以退出的时候通知我们sigs := make(chan os.Signal, 1)done := make(chan bool, 1)// `signal.Notify`在给定的channel上面注册该channel// 可以接受的信号signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)// 这个goroutine阻塞等待信号的到来,当信号到来的时候,// 输出该信号,然后通知程序可以结束了go func() {sig := <-sigsfmt.Println()fmt.Println(sig)done <- true}()// 程序将等待接受信号,然后退出fmt.Println("awaiting signal")<-donefmt.Println("exiting")
}
当运行程序的时候,程序将阻塞等待信号的到来,我们可以使用CTRL+C
来发送一个SIGINT
信号,这样程序就会输出interrupt后退出。
awaiting signalinterrupt
exiting
golang中的信号相关推荐
- golang中os/signal包的使用
golang中os/signal包的使用 os/signal包实现对信号的处理 golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号:一个是 s ...
- Golang中的自动伸缩和自防御设计
Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...
- Linux Signal及Golang中的信号处理
转载地址:https://colobu.com/2015/10/09/Linux-Signals/ 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方 ...
- Golang中panic与recover的实现原理
今天我们讲讲golang中panic异常,以及recover对异常的捕获,由于panic.recover.defer之间非常亲密,所以今天就放在一起讲解,这里会涉及到一些defer的知识,有兴趣可以看 ...
- Golang 中的 Goroutine 调度原理与 Chanel 通信
简介 在 Go 中,每一个并发的活动称为一个 Goroutine 或者 协程.当一个程序启动时,只有一个 Goroutine 来调用 main 函数,称之为 主Goroutine.新的 Gorou ...
- golang中的atomic,以及CAS操作
CAS无锁算法 要实现无锁(lock-free)的非阻塞算法有多种实现方法,其中CAS(比较与交换,Compare and swap)是一种有名的无锁算法.CAS是CPU指令,在大多数处理器架构,包括 ...
- 【Golang】关于信号signal处理
我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出.我们采用系统Signal来 通知系统退出,即kill pragram-pid.我们 ...
- linux内核定义的常用信号6,Linux中的信号
在 Linux 中,理解信号的概念是非常重要的.这是因为,信号被用于通过 Linux 命令行所做的一些常见活动中.例如,每当你按 Ctrl+C 组合键来从命令行终结一个命令的执行,你就使用了信号.每当 ...
- Golang中Buffer高效拼接字符串以及自定义线程安全Buffer
本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...
最新文章
- linux系统中指定端口连接数限制
- Spring boot排除依赖
- Winform中使用EasyPlayer-RTSP-Win开源组件实现播放RTSP视频流
- Elasticsearch 入门教程
- mysql if selected_初识MySQL
- .NET内存管理五大基础知识
- Apache ab 压力测试工具
- linux zookeeper 端口号,linux下zookeeper安装
- 计算机网络第五版思维导图大全集
- 使用深度森林(Deep Forest)进行分类-Python
- 每个设计师都应该了解的IOS编年史
- 腾讯云搭建Socks5多IP代理服务器实现游戏单窗口单IP完美搭建教程附带工具
- rs232与db9接线方式
- 大数据技术在银行业中的应用场景,主要有哪些?
- 腾讯电脑管家卸载后的残留信息有哪些
- H264 YUV420视频翻转
- M001: MongoDB Basics Chapter 3: Deeper Dive on the MongoDB Query Language学习记录
- 网络打印机提示的“功能地址0x造成了一个保护错误”问题解决方案
- Web安全防范-----防止重放攻击
- 黑马ssm学习笔记-企业权限管理系统
热门文章
- 【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )
- 【Android 应用开发】Android 图表绘制 achartengine 示例解析
- 【网络安全】网络安全攻防 -- 黑客攻击简要流程
- 如何把VS Code的Language Server Protocol整合到Eclipse中来
- Android中的ImageView的getDrawableCache获取背景图片的时候注意的问题
- android中可以使用bitmap的平铺,镜像平铺等减小图片带来的apk过大的问题
- 鼠标位置精确定位总结
- 2014/3/16 长沙多校(第三次)
- EM 期望最大化算法
- 选择Data类型在Access与Sql中的区别