有时候,我们希望 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 |
下一个例子: 退出