2016-08-08 50 views
9

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çin

trap '' 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. :-(

+1

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

+1

Not a Go, aslında aynı şeyi C de denerseniz de olur. – Leandros

cevap

0

Kullanım winpty Windows için Git Bash doğru sinyalleri yakalamak için Montajda ile birlikte geliyor, bu yüzden yapmanız gereken tek şey:.

$ winpty ./my-program.exe