2016-09-15 7 views
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コールが含まれており、インポートされたコードを編集せずにプログラムが終了する前にクリーンアップを行いたいと思います。

+1

実際には、理にかなった信号だけを処理する必要があります。 'SIGWINCH'や' SIGALRM/SIGCTALRM'、 'SIGXCPU'などのような非終了信号からのクリーンアップはおそらくありません。また、そこには扱えないシグナルもあります。 – JimB

+0

os.Exit(x)のnuclearオプションの代わりに、次のような亜種を試してみてください:https://play.golang.org/p/kHIfKoXuKt –

+0

@MartinGallagherインポートされたコードからos.Exit(x)を削除できません –

答えて

4

できません。 TFMから:

プログラムはすぐに終了します。遅延関数は実行されません。

関連する問題