golang 处理系统 Signal 实现程序优雅退出

go 通过处理系统的 Signal 可以实现程序的优雅退出,go signal 包中的 Notify 函数定义如下:
func Notify(c chan<- os.Signal, sig …os.Signal)
该函数会将进程收到的系统 Signal 转发给 channel c,转发哪些信号由该函数的可变参数决定。

  • 如果你没有传入 sig 参数,那么 Notify 会将系统收到的所有信号转发给c。
  • 如果传入了 sig 参数,则 go 只会关注你传入的 Signal 类型,其他的 Signal 会按照默认方式处理。

因此你可以在 Notify 函数中传入你要关注和处理的 Signal 类型,通过自定义函数来改变信号对应的行为。

简单示例代码如下:

package main

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

func main() {
    signalChan := make(chan os.Signal, 1)
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
    <-signalChan 
    /* 可以在下面定义一些资源回收,代码清理工作 */
    fmt.Println("exit...") 
}

上述代码监听了如下信号:

  • SIGINT: Ctrl-C 发送 INT signal (SIGINT),通常导致进程结束
  • SIGTERM: 程序结束(terminate)信号
  • 有两种信号不能被拦截和处理: SIGKILL 和 SIGSTOP
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号,为 Linux 提供了一种处理异步事件...
    故事狗阅读 85,632评论 2 62
  • 进程间的通信主要分为本机器进程间的通信和不同机器间进程的通信。本文主要描述本机进程间的通信。 一、传统Linux的...
    一叶之界阅读 415评论 0 2
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,071评论 0 50
  • 额 我从1点多写到现在 写了接近1个半小时 眼睛好困 又熬夜了…… 第39天 认证照 2017-6-3-六 ...
    流氓文氓阅读 268评论 0 0
  • 《正念的奇迹》读了这本书,觉得自己淡定了许多,也帮助了我控制自己的情绪化的问题。 “最重要的时刻只有一个,那就是...
    潍坊泰华DDM张娟阅读 269评论 3 0