Goland存在的问题
相信大部分同学都使用Goland的Debug功能,Debug工具为我们日常开发带来了很大的便捷。但长期以来Debug功能存在一个问题是,stop debug时程序没法捕捉到信号量。
在jetbrains社区里,2018年就有人提出了 讨论链接:https://youtrack.jetbrains.com/issue/GO-5982 ,如今已经2022年了,Goland 2022.3 EAP最新预览版终于修复了该问题。
我自己安装了最新预览版尝试了,的确解决了该问题,点赞~
举例
在终端中运行以下代码时,我们可以使用键盘ctrl-c
发送中断,这允许我们在代码里面处理应用一些资源回收、优雅关闭等逻辑。目前的旧版本Goland debug是捕获不到信号量的
package main
import (
"log"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
// 监听退出信号
shutdown := make(chan os.Signal, 1)
signal.Notify(shutdown, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
log.Println("程序启动")
_ = <-shutdown
// TODO 清理操作
time.Sleep(time.Second * 2)
log.Println("程序退出")
os.Exit(0)
}
附:Go 中支持的信号量
信号值 | 值 | 动作 | 说明 |
---|---|---|---|
SIGHUP | 1 | Term | 终端控制进程结束(终端连接断开) |
SIGINT | 2 | Term | 用户发送INTR字符(Ctrl+C)触发 |
SIGQUIT | 3 | Core | 用户发送QUIT字符(Ctrl+/)触发 |
SIGILL | 4 | Core | 非法指令(程序错误、试图执行数据段、栈溢出等) |
SIGABRT | 6 | Core | 调用abort函数触发 |
SIGFPE | 8 | Core | 算术运行错误(浮点运算错误、除数为零等) |
SIGKILL | 9 | Term | 无条件结束程序(不能被捕获、阻塞或忽略) |
SIGSEGV | 11 | Core | 无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作) |
SIGPIPE | 13 | Term | 消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作) |
SIGALRM | 14 | Term | 时钟定时信号 |
SIGTERM | 15 | Term | 结束程序(可以被捕获、阻塞或忽略) |
SIGUSR1 | 30,10,16 | Term | 用户保留 |
SIGUSR2 | 31,12,17 | Term | 用户保留 |
SIGCHLD | 20,17,18 | Ign | 子进程结束(由父进程接收) |
SIGCONT | 19,18,25 | Cont | 继续执行已经停止的进程(不能被阻塞) |
SIGSTOP | 17,19,23 | Stop | 停止进程(不能被捕获、阻塞或忽略) |
SIGTSTP | 18,20,24 | Stop | 停止进程(可以被捕获、阻塞或忽略) |
SIGTTIN | 21,21,26 | Stop | 后台程序从终端中读取数据时触发 |
SIGTTOU | 22,22,27 | Stop | 后台程序向终端中写数据时触发 |
相关链接
Goland预览版下载地址:https://www.jetbrains.com.cn/go/nextversion/
评论(0)