golang 去unix信号ctrl + C.

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 去unix信号ctrl + C.相关的知识,希望对你有一定的参考价值。

import "fmt"
import "os"
import "os/signal"
import "syscall"

func main() {

	sigs := make(chan os.Signal, 1)
	done := make(chan bool, 1)

	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

	go func() {
		sig := <-sigs
		fmt.Println()
		fmt.Println(sig)
		done <- true
	}()

	fmt.Println("awaiting signal")
	<-done
	fmt.Println("exiting")
}

捕获Ctrl + C中断 优雅的退出程序 golang

捕获Ctrl + C中断 优雅的退出程序

Gracefully terminate a program in Go

// Notify方法将signal发送到channel,
func Notify(c chan<- os.Signal, sig ...os.Signal)
// 初始化一个接受os.Signal的通道
c := make(chan os.Signal)
// 调用Notify方法,绑定signal到channel,一旦有信号到达,signal会发送到channel中
signal.Notify(c, os.Interrupt)
  1. 代码实现在命令行每隔200ms打印字符"#",使用time.Ticker实现每隔2s打印完整一次
  2. task有一个close的channel,用来接受停止信号
  3. 实例化一个os.Signal来接受诸如ctrl+c的停止信号
  4. 使用sync.WaitGroup来组织多个goroutine的调度
package main

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

type Task struct {
    closed chan struct{}
    wg     sync.WaitGroup
    ticker *time.Ticker
}

func (t *Task) Run() {
    for {
        select {
        case <-t.closed:
            return
        case <-t.ticker.C:
            handle()
        }
    }
}

func (t *Task) Stop() {
    close(t.closed)
}

func handle() {
    for i := 0; i < 5; i++ {
        fmt.Print("#")
        time.Sleep(time.Millisecond * 200)
    }
    fmt.Println()
}

func main() {
    task := &Task{
        closed: make(chan struct{}),
        ticker: time.NewTicker(time.Second * 2),
    }

    c := make(chan os.Signal)
    signal.Notify(c, os.Interrupt)

    task.wg.Add(1)
    go func() { defer task.wg.Done(); task.Run() }()

    select {
    case sig := <-c:
        fmt.Printf("Got %s signal. Aborting...\n", sig)
        task.Stop()
    }
  task.wg.Wait()
}

以上是关于golang 去unix信号ctrl + C.的主要内容,如果未能解决你的问题,请参考以下文章

Unix命令行中的Ctrl + Z和Ctrl + C的区别

Unix信号机制的简单介绍

信号处理是Unix和LInux系统为了响应某些状况而产生的事件

Golang信号处理和优雅退出守护进程

UNIX 信号和 Traps

捕获Ctrl + C中断 优雅的退出程序 golang