Avatar ·

如何在Go中拦截Ctrl+C(SIGINT)并像defer一样执行资源清理

大家好!我正在用Go编写一个服务器应用程序,它打开TCP连接、处理文件和数据库。我需要确保在按下Ctrl+C(SIGINT信号)时,程序能够正确退出:关闭连接、保存数据、释放资源。 我知道`defer`——它在函数正常退出时工作得很好。但当我按下Ctrl+C时,程序直接被杀死,`defer`不会执行。例如: ```go func main() { db, _ := sql.Open("postgres", "...") defer db.Close() // 某个无限循环 for { // 工作 } } ``` 按下Ctrl+C时,`defer db.Close()`不会执行。我读过`os/signal`包,但不知道如何正确组织“类似defer”的行为。如何确保在任何退出(正常或信号)时都能保证执行清理函数?需要一个graceful shutdown的例子。 <<>>

问题:defer在OS信号下不执行

您