[Go 02]信号处理和退出程式

一般在执行go run main.go后就会马上回到命令列
这边实作当接收到ctrl+c或是终止程式才停止

上程式码:

func main() {fmt.Println("start")errs := make(chan error, 1)listenForSignal(errs)c := <-errsfmt.Println("terminating:", c)}func listenForSignal(errChan chan error) {go func() {c := make(chan os.Signal)signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)errChan <- fmt.Errorf("%s", <-c)}()}

说明:

使用"os/signal"包
用来接收讯号使用,notify方法用来监听收到的信号(stop方法则取消)SIGINT表示用户按下INTR字符(Ctrl+C)触发SIGTERM结束程序 kill pid的作用是向进程为pid的程序发送SIGTERM其他像是SIGKILL kill -9 pid则是发送立即终止 等等就先不使用

测试接收SIGINT

然后执行go run main.go后,会看到服务就一直执行着,再按下ctrl+c

> go run main.gostart^Cterminating: interrupt

测试接收SIGTERM

先将main.go编译成执行档 -o代表放在目前目录下 取名为demo
"./"执行demo这档案

go build -o ./demo  main.go ./demo start

接下来开另一视窗 找出进程跟demo有关的pid 然后执行kill pid,确认已停止了

➜  ~ ps -A  | grep demo     14693 ttys000    0:00.00 ./demo➜  ~ kill 14693➜  ~ ps -A  | grep demo

回到程式执行视窗就会看到以下被中止的讯息了

 ./demostartterminating: terminated

后记:不太知道到底要怎么要在vscode debug模式
去模拟ctrl+c时会跑到的地方来看程式,google未有结果,无解


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章