2016-08-08 9 views
9

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... 

クリーンアップは、()は実行されません。 :-(

+1

ここで同様の設定を持つ人のhttpsをがあるようです://sourceforge.net/p/mingw-w64/bugs/561/ Keynan Prattにフォローアップする価値があるかもしれませんが、GOバグかもしれないという言葉がありましたが、おそらくそれはMINGW64にあるかもしれません。おそらくあなたのポストにポインタを戻してください。 – JGFMK

+1

実際にはバグではありませんが、実際にはCで同じことを試してみても起こります。 – Leandros

答えて

0

使用winptyは、Windows用のGitのBashで正しく信号をキャッチすることは、インストールにバンドルされているので、すべてを行う必要がある:。

$ winpty ./my-program.exe 
関連する問題