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
Zugabetrap '' 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. :-(
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
Kein Go-Bug, passiert eigentlich auch, wenn du dasselbe in C versuchst. – Leandros