2016-08-08 42 views
9

Ich möchte bestimmten Code vor dem Beenden ausführen, wenn der Benutzer STRG-C drückt. Der Code ist in Go und ich möchte es auf Windows mit Git Bash/MINGW64 ausführen. Mit Go, ichFang CTRL-C unter Windows mit Git Bash/MINGW64 mit Go

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

Unter Windows funktioniert dies, wenn ich eine Windows-Befehlszeile verwenden, aber ich will es auch auf MINGW64/Git Bash arbeiten.

fand ich auf https://stackoverflow.com/a/31974985/1370397 dass

Zugabe
trap '' SIGINT 

zu ~/.bashrc Fallen das Signal SIGINT und verhindert, dass bash mein Programm beendet wird.

Dies funktioniert für mich auf mingw32 mit bash Version

$ bash --version 
GNU bash, version 3.1.20(4)-release (i686-pc-msys) 
Copyright (C) 2005 Free Software Foundation, Inc. 

aber es funktioniert nicht auf MINGW64, bash Version

$ bash --version 
GNU bash, version 4.3.42(5)-release (x86_64-pc-msys) 
Copyright (C) 2013 Free Software Foundation, Inc. 
[...] 

arbeitet Was auf MINGW64 oder an dieser neuen (git) bash-Version ist anders ?

Zum einfacheren Tests, hier ist ein minimales Beispiel die Verhaltensunterschiede zu sehen:

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...") 
    } 
} 

Ausgabe von mingw32 (mit Trap '' SIGINT in ~/.bashrc):

$ ./sigint.exe 
Working... 
Working... 
Working... 
Interrupt received - calling cleanup()... 
Cleaning up... 
Working... 
Working... 
Cleaning up... 
Working... 
Cleaning up... 
Working... 
Working... 
Quitting... 

Der cleanup() - Code wird ausgeführt.

Ausgabe von MINGW64 (auch mit trap '' SIGINT in ~/.bashrc):

$ ./sigint.exe 
Working... 
Working... 
Working... 
Working... 

Bereinigung() erhält nicht ausgeführt. :-(

+1

Es scheint hier jemand mit ähnlicher Einrichtung zu sein https : //sourceforge.net/p/mingw-w64/bugs/561/ Es könnte sich lohnen, mit Keynan Pratt weiterzumachen Es wurde erwähnt, dass es sich um einen GO-Bug handeln könnte, aber nach dem, was Sie gesagt haben, ist es vielleicht in MINGW64. Du solltest hier vielleicht den Zeiger zu deinem Post hinzufügen – JGFMK

+1

Kein Go-Bug, passiert eigentlich auch, wenn du dasselbe in C versuchst. – Leandros

Antwort

0

Verwenden winpty Signale zu fangen richtig in Git Bash für Windows, um es mit der Installation mitgeliefert wird, so alles, was Sie tun müssen, ist:.

$ winpty ./my-program.exe