我可以在中断时进行一些清理(当我按下 时ctrlc)。
$ go build
$ ./exit
^Creceived interrupt signal
Run Code Online (Sandbox Code Playgroud)
是否可以os.Exit在程序退出之前以相同的方式调用并运行一些代码?编码:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
handleInterrupt(2)
time.Sleep(2 * time.Second)
os.Exit(1) // how to trap it?
}
func handleInterrupt(intrptChSize int) {
s := make(chan os.Signal, intrptChSize)
signal.Notify(s,
syscall.SIGABRT,
syscall.SIGALRM,
syscall.SIGBUS,
syscall.SIGCHLD,
syscall.SIGCONT,
syscall.SIGEMT,
syscall.SIGFPE,
syscall.SIGHUP,
syscall.SIGILL,
syscall.SIGINFO,
syscall.SIGINT,
syscall.SIGIO,
syscall.SIGIOT,
syscall.SIGKILL,
syscall.SIGPIPE,
syscall.SIGPROF,
syscall.SIGQUIT,
syscall.SIGSEGV,
syscall.SIGSTOP,
syscall.SIGSYS,
syscall.SIGTERM,
syscall.SIGTRAP,
syscall.SIGTSTP,
syscall.SIGTTIN,
syscall.SIGTTOU,
syscall.SIGURG,
syscall.SIGUSR1,
syscall.SIGUSR2,
syscall.SIGVTALRM,
syscall.SIGWINCH,
syscall.SIGXCPU,
syscall.SIGXFSZ)
go func() {
for sig := range s {
fmt.Printf("received %s signal\n", sig)
//cleanup()
}
}()
}
Run Code Online (Sandbox Code Playgroud)
我知道在这个例子中我可以cleanup在每个os.Exit()代码之前手动运行:
cleanup()
os.Exit(1)
Run Code Online (Sandbox Code Playgroud)
但在我的实际项目中,我正在导入无法编辑的代码。此代码包含os.Exit调用,我想在程序退出之前进行一些清理而不编辑导入的代码。