Kullanıcı CTRL-C'yi işaret ettiğinde çıkmadan önce belirli bir kodu çalıştırmak istiyorum. Kod Go içinde ve Git Bash/MINGW64 kullanarak Windows üzerinde çalıştırmak istiyorum. Go kullanarak, ben Windows komut satırını kullandığınızda bu işleri, Windows'taGit Bash/MINGW64 kullanarak Windows'ta CTRL-C'yi CTRL-C kullanarak yakalayın.
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
}
}
yapmak, ama aynı zamanda MINGW64/Git Bash üzerinde çalışmak istiyorum.
ben ~/.bashrc içintrap '' SIGINT
ekleyerek SIGINT sinyalini yakalar ve benim program sonlandırma bash önlediğini https://stackoverflow.com/a/31974985/1370397 üzerinde bulduk.
Bu
bash sürümü$ bash --version
GNU bash, version 3.1.20(4)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.
ile mingw32 üzerinde benim için çalışıyor ama MINGW64, bash sürüm üzerinde çalışmak için başarısız MINGW64 veya söz konusu yeni (git) bash sürümüne farklı Ne
$ bash --version
GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)
Copyright (C) 2013 Free Software Foundation, Inc.
[...]
?
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...")
}
}
mingw32 dan (~/Bashrc içinde sigint 'tuzağı) Çıkış:
$ ./sigint.exe
Working...
Working...
Working...
Interrupt received - calling cleanup()...
Cleaning up...
Working...
Working...
Cleaning up...
Working...
Cleaning up...
Working...
Working...
Quitting...
kolay testi için
, burada davranış farkı görmek için en az bir örnektir cleanup() kodu çalıştırılır. (~/Bashrc içinde sigint 'de tuzağı) MINGW64 den
Çıkış:
$ ./sigint.exe
Working...
Working...
Working...
Working...
temizleme() yürütülen almaz. :-(
burada benzer kurulum ile birileri https gibi görünüyor : //sourceforge.net/p/mingw-w64/bugs/561/ Keynan Pratt ile takip edilmeye değer olabilir Bir GO hatası olabileceğinden bahsetmiştik ama belki de MINGW64'te olduğunu söylediniz. İşaretçinizi buraya geri göndermelisiniz belki de – JGFMK
Not a Go, aslında aynı şeyi C de denerseniz de olur. – Leandros