在实际项目中我们可能有下面的需求:
1、修改了配置文件后,希望在不重启进程的情况下重新加载配置文件;
2、当用 Ctrl + C 强制关闭应用后,做一些必要的处理;

这时候就需要通过信号传递来进行处理了。golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号;一个是 stop方法用来取消监听。

 

监听信号

notify方法原型
func Notify(c chan<- os.Signal, sig ...os.Signal)
第一个参数表示接收信号的管道
第二个及后面的参数表示设置要监听的信号,如果不设置表示监听所有的信号。

 

下面是一个非常简单地例子:

package main

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

func main() {
    c := make(chan os.Signal)
    signal.Notify(c)

    //signal.Notify(c, syscall.SIGHUP, syscall.SIGUSR2)  //监听指定信号

    s := <-c //阻塞直至有信号传入
    fmt.Println("get signal:", s)
}

执行效果:

当按下 ctrl +c 键时:

上面的代码过于简单,一般我们会是用下面代码的方式来处理的。

package main

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

func main() {
    go signalListen()
    time.Sleep(time.Hour)
}

func signalListen() {
    c := make(chan os.Signal)
    signal.Notify(c)
    for {
        s := <-c
        //收到信号后的处理,这里只是输出信号内容,可以做一些更有意思的事
        fmt.Println("get signal:", s)
        os.Exit(1)
    }
}

执行效果:

这是在进入应用后, 按了四次回车,然后再按 Ctrl +C 的执行效果:

 

停止监听

package main

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

func main() {
    c := make(chan os.Signal)
    signal.Notify(c)

    //当调用了该方法后,下面的for循环内<-c接收到一个信号就退出了。
    signal.Stop(c)

    for {
        s := <-c
        fmt.Println("get signal:", s)
    }
}

执行效果:

 

golang中处理信号非常简单,但是关于信号本身需要了解的还有很多,建议可以参考《Unix高级编程》中的信号篇章。

 

 

参考资料:

golang信号signal的处理
http://www.01happy.com/golang-signal/

Go中的系统Signal处理
http://tonybai.com/2012/09/21/signal-handling-in-go/

Golang的 signal的更多相关文章

  1. golang处理signal

    signal一般用来实现优雅重启,或者重新加载配置文件等操作. 废话不多说,上表格 动作 号码 信号 golang kill pid 15 SIGTERM terminated kill -9 pid ...

  2. Go的优雅终止姿势

    最近优化了一版程序:用到了golang的优雅退出机制. 程序使用etcd的election sdk做高可用选主,需要在节点意外下线的时候,主动去etcd卸任(删除10s租约), 否则已经下线的节点还会 ...

  3. Golang -- Signal处理

    我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出.我们采用系统Signal来 通知系统退出,即kill pragram-pid.我们 ...

  4. golang语言中os/signal包的学习与使用

    package main; import ( "os" "os/signal" "fmt" ) //signal包中提供了两个函数 //No ...

  5. golang 管道

    2.管道简介Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性.本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具 ...

  6. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

    目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ?   RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...

  7. golang内存分配

    golang内存分配 new一个对象的时候,入口函数是malloc.go中的newobject函数 func newobject(typ *_type) unsafe.Pointer { flags ...

  8. golang channel 用法转的

    一.Golang并发基础理论 Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论.但就像John Gra ...

  9. 深入学习golang(2)—channel

    Channel 1. 概述 “网络,并发”是Go语言的两大feature.Go语言号称“互联网的C语言”,与使用传统的C语言相比,写一个Server所使用的代码更少,也更简单.写一个Server除了网 ...

随机推荐

  1. bash: wget: command not found

    有些VPS执行wget命令下载时,提示-bash: wget: command not found错误,其实这是由于系统中没有安装wget,我们只要执行安装命令安装即可. yum -y install ...

  2. C# ListView用法详解 很完整

    一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设 ...

  3. leetcode python找不同

    给两个字符串,第二个字符串是第一个字符串乱序后再随机插入一个字母在随机的位置,需要我们找到这个字母 输入: s = "abcd" t = "abcde" 输出: ...

  4. js时间转变

    1.转换为标准时间 var parserDate = function (date) { var t = Date.parse(date); if (!isNaN(t)) { return new D ...

  5. 【EF数据库链接报错】“The underlying provider failed on open”

    EF在操作数据库时要反复链接.断开数据库,如果连接字符串是windows 服务验证,而不是用的用户名和密码,那么尝试访问数据库的用户是NT AUTHORITY\NETWORK SERVICE.权限不够 ...

  6. 【HNOI2019】部分题简要题解

    题意懒得写了 LOJ Day 1 T1 鱼 个人做法比较猎奇,如果有哪位大佬会证明能分享一下的话感激不尽. 题解:枚举鱼尾和鱼身的交点D,将所有其他点按照到D的距离排序,距离相同的分一组. 感性的理解 ...

  7. Windows7上用VS编译本地使用的live555

    本文链接:https://www.jianshu.com/p/6ea100865744 环境 系统:Windows7 SP1 64位 编辑器:Visual Studio Community 2017 ...

  8. 更换bbr内核

    1:首先yum update -y更新到最新CentOS 7.3 1611cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core) 2: ...

  9. java处理数据库的CRUD

    package com.lhy.jdbc.util; import java.sql.Connection; import java.sql.PreparedStatement; import jav ...

  10. Path;Paths和Files;FileVisitor

    package filet; import java.io.FileOutputStream; import java.nio.file.FileStore; import java.nio.file ...