CTRL-Cを押すと終了する前に特定のコードを実行したい。コードはGoにあり、Git Bash/MINGW64を使ってWindows上で実行したい。 Go]を使用して、私はWindows上でGit Bash/MINGW64 with Goを使用してWindowsでCTRL-Cを捕捉する
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
// some goroutines get started here
// ...
for {
select {
case <-interrupt:
// code which shall be run on CTRL-C
}
}
を行う、私は、Windowsのコマンドラインを使用する場合、これは動作しますが、私はそれは同様にMinGW64/GitのBashの上で仕事をしたいです。
私は〜/ .bashrcのに
trap '' SIGINT
を追加すると、SIGINTシグナルをトラップし、私のプログラムを終了からbashのを防ぐこと。https://stackoverflow.com/a/31974985/1370397で発見
これは、bashのバージョン
$ bash --version
GNU bash, version 3.1.20(4)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.
でMINGW32に私のために動作しますが、それはにMinGW64上で動作するように失敗し、bashのバージョンにMinGW64上またはその新しい(gitの)bashのバージョンに異なる何
$ bash --version
GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)
Copyright (C) 2013 Free Software Foundation, Inc.
[...]
?ここ
容易に試験するためは、動作の違いを見るために、最小限の例です:MINGW32から
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func cleanup(){
for i:=0; i<3; i++ {
fmt.Println("Cleaning up...")
time.Sleep(500*time.Millisecond)
}
}
func work() {
for {
fmt.Println("Working...")
time.Sleep(300*time.Millisecond)
}
}
func main() {
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
go work()
for {
select {
case <-interrupt:
fmt.Println("Interrupt received - calling cleanup()...")
cleanup()
fmt.Println("Quitting...")
return
}
fmt.Println("Waiting...")
}
}
出力(〜/ .bashrcの中にトラップを持つ '' SIGINT):
$ ./sigint.exe
Working...
Working...
Working...
Interrupt received - calling cleanup()...
Cleaning up...
Working...
Working...
Cleaning up...
Working...
Cleaning up...
Working...
Working...
Quitting...
cleanup()コードが実行されます。 (〜/ .bashrcの中SIGINT '' もトラップ付き)にMinGW64から
出力:
$ ./sigint.exe
Working...
Working...
Working...
Working...
クリーンアップは、()は実行されません。 :-(
ここで同様の設定を持つ人のhttpsをがあるようです://sourceforge.net/p/mingw-w64/bugs/561/ Keynan Prattにフォローアップする価値があるかもしれませんが、GOバグかもしれないという言葉がありましたが、おそらくそれはMINGW64にあるかもしれません。おそらくあなたのポストにポインタを戻してください。 – JGFMK
実際にはバグではありませんが、実際にはCで同じことを試してみても起こります。 – Leandros