有时候,我们希望 Go 可以智能的处理 Unix 信号。
例如,我们希望当服务器接收到一个 |
|
package main |
|
import ( "fmt" "os" "os/signal" "syscall" ) |
|
func main() { |
|
Go 通过向一个通道发送 |
sigs := make(chan os.Signal, 1) |
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) |
我们可以在 main 函数中从 |
done := make(chan bool, 1) |
这个协程执行一个阻塞的信号接收操作。 当它接收到一个值时,它将打印这个值,然后通知程序可以退出。 |
go func() { |
sig := <-sigs fmt.Println() fmt.Println(sig) done <- true }() |
|
(也就是上面的协程发送的 |
fmt.Println("awaiting signal") <-done fmt.Println("exiting") } |
当我们运行这个程序时,它将一直等待一个信号。
通过 |
$ go run signals.go awaiting signal ^C interrupt exiting |
下一个例子: 退出