如何在 Golang 中处理信号?
在讨论**信号**以及如何处理它们之前,让我们先谈谈创建**信号**的常见场景。**信号**可以通过终端传递,可以通过使用**CTRL+C**终止程序,或者我们可以默认调用**os**包提供的**Exit()**函数。
示例 1
让我们考虑一个示例,其中我们将在一个已延迟的函数声明之后立即调用**os.Exit()**函数。
请考虑以下代码。
package main
import (
"fmt"
"os"
"time"
)
func main() {
defer func() {
fmt.Println("Inside the deferred function()")
}()
fmt.Println("Inside the main function")
time.Sleep(1 * time.Second)
os.Exit(1)
}在上面的代码中,我们调用了**os.Exit()**函数,它将不会给延迟的匿名函数执行的机会,因为程序将退出。
输出
如果我们使用命令**go run main.go**运行上面的代码,那么我们将在终端中得到以下输出。
Inside the main function Program exited: status 1.
我们可能会得到的另一个信号是,我们使用**CTRL+C**终止进程。
如何在 Golang 中处理信号
我们确实讨论了将信号传递到程序的不同方法。现在,让我们讨论一下如何在 Go 中处理这些信号。
为了优雅地处理这些信号,我们可以使用一个类型为**os.Signal**的**通道**,它将具有阻塞性质。然后,我们将使用**Notify()**函数,在其中我们可以传递我们期望的不同类型的信号,例如**os.Interrupt**和**syscall.SIGTERM**。
示例 2
请考虑以下代码。
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
sigChannel := make(chan os.Signal, 1)
signal.Notify(sigChannel, os.Interrupt, syscall.SIGTERM)
fmt.Println("Try pressing CTRL + C to handle the interrupt")
select {
case <-sigChannel:
fmt.Println("The interrupt got handled")
os.Exit(0)
}
}
在上面的代码中,我们创建了一个容量为 1 的缓冲通道,然后我们调用了**Notify()**函数。
输出
如果我们使用命令**go run main.go**运行上面的代码,然后按下**CTRL + C**,那么我们将在终端中得到以下输出。
Try pressing CTRL + C to handle the interrupt The interrupt got handled
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP