2
私は中断時に何らかのクリーンアップを実行できます(ctrlc)。トラップos.golangで終了
$ go build
$ ./exit
^Creceived interrupt signal
プログラムを終了する前に同じ方法で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()
}
}()
}
私はちょうどこの例では、手動で各os.Exit()
コードの前にcleanup
を実行することができます知っている:
cleanup()
os.Exit(1)
しかし、私の実際のプロジェクトで、私は私が編集することはできませんコードをインポートしています。このコードにはos.Exit
コールが含まれており、インポートされたコードを編集せずにプログラムが終了する前にクリーンアップを行いたいと思います。
実際には、理にかなった信号だけを処理する必要があります。 'SIGWINCH'や' SIGALRM/SIGCTALRM'、 'SIGXCPU'などのような非終了信号からのクリーンアップはおそらくありません。また、そこには扱えないシグナルもあります。 – JimB
os.Exit(x)のnuclearオプションの代わりに、次のような亜種を試してみてください:https://play.golang.org/p/kHIfKoXuKt –
@MartinGallagherインポートされたコードからos.Exit(x)を削除できません –