- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
拦截信号Golang应用优雅关闭的操作方法
目录从示例开始接收信号常见信号处理多个信号NotifyContext示例总结Golang不是像C语言的系统级编程语言,但仍提供了以下特性帮助开发者与底层操作系统进行交互,如信号(singals),os/singals包实现了这些功能。相对于其他语言处理OS信号采用复杂或冗余的方法,Golang内置OS包提供了易用的方法处理Unix信号,非常直接、简单。事实上,类unix系统中通常处理singal是必要的,本文介绍singal概念,并通过示例说明其应用场景。
从示例开始
假设场景:Golang应用在关闭时打印消息:ThankyouforusingGolang.首先新建main函数,函数体模拟执行一些业务,直到接收到结束命令。
funcmain(){
for{
fmt.Println(DoingWork)
time.Sleep(1*time.Second)
}
当运行应用,然后从OS发送执行kill信号(Ctrl+C),可能输出结果类似这样:
DoingWork
DoingWork
DoingWork
Processfinishedwithexitcode2
现在我们希望拦截kill信号并定义处理逻辑:打印必要的关闭信息。
接收信号
首先创建channe接收来自操作系统的命令,os包提供了signal接口处理基于OS规范信号实现。
killSignal:=make(chanos.Signal,1)
为了通知killSignal,需使用signal包中提供的Notify函数,第一个参数为Signal类型的channel,下一个参数接收一组发给通道的信号列表。
Notify(cchan-os.Signal,sig...os.Signal)
我们也可以使用syscall包通知特定命令的信号:
signal.Notify(cchan-os.Signal,syscall.SIGINT,syscall.SIGTERM)
为了处理信号,我们在main函数中使用killSignal通道等待interrupt信号,一旦接收到来自OS的命令,则打印结束消息并接收应用。现在把处理业务的循环代码移入独立的goroute中,这里定义一个匿名函数:
gofunc(){
for{
fmt.Println(DoingWork)
time.Sleep(1*time.Second)
}()
因为业务代码运行在独立routine中,main函数实现等待killSignal信号并在结束之前打印消息。
-killSignal
fmt.Println(ThanksforusingGolang!)
完整代码
下面把几个部分组装在一起,完整代码如下:
packagemain
import(
fmt
os
os/signal
time
funcmain(){
killSignal:=make(chanos.Signal,1)
signal.Notify(killSignal,os.Interrupt)
gofunc(){
for{
fmt.Println(DoingWork)
time.Sleep(1*time.Second)
-killSignal
fmt.Println(ThanksforusingGolang!)
}
运行程序,看到一直执行业务循环,直到接收到interrupt信号,打印消息并结束:
DoingWork
DoingWork
DoingWork
ThanksforusingGolang!
常见信号
对于命令行程序,当按CTRL+C时,会发送SIGINT信号,SIGINT是与指定特定信号数字相关联的名称。信号实际是可以有程序生成的软件中断,也是一种异步处理事件机制。通常为了安全起见,信号采用名称而不是数值生成。
大多数信号及其具体动作都是由操作系统定义的,并还在操作系统权限范围内执行相应功能。因此能够处理某些事件并不能让用户自由地使用系统,有些信号即使生成了也会被操作系统忽略,而由操作系统决定程序允许处理哪些信号。
举例,SIGKILL和SIGSTOP信号也可以被捕获、阻塞或忽略。因为这些信号对于保持操作系统功能的健全至关重要,在极端条件下为内核和root用户提供了停止进程的方法。与SI
文档评论(0)