Выйти из программы Go на Ctrl+C
У меня возникают трудности с отменой моей программы с помощью Ctrl+C. Я полагаю, что мои знания о каналах должны быть немного неправильными, так как я не могу понять, почему эта программа не закрывается с помощью Ctrl+C, когда она запрашивает пароль.
Кто-нибудь сможет сказать, почему он не выйдет после запроса "Пароль" и нажатия Ctrl+C?
package main
import (
"fmt"
"os"
"os/user"
"os/signal"
"syscall"
"github.com/howeyc/gopass"
)
func main() {
signalChannel := make(chan os.Signal, 2)
signal.Notify(signalChannel, os.Interrupt, syscall.SIGINT)
go func() {
sig := <-signalChannel
switch sig {
case os.Interrupt:
os.Exit(0)
case syscall.SIGINT:
os.Exit(0)
}
}()
user, _ := user.Current()
fmt.Printf("Hi %s, password please: ", user.Username)
pass := gopass.GetPasswd()
fmt.Printf("Recieved as: %s\r\n", pass)
}
Любая помощь приветствуется, спасибо.
Обновить
Я решил эту проблему, переключившись на https://github.com/seehuhn/password который прослушивает сигналы
1 ответ
Ctrl-C
это SIGINT. Ctrl-\
SIGQUIT (по умолчанию). Вы захотите изменить сигнал, который слушает ваше приложение.
Этот ответ содержит некоторые дополнительные сведения о типичных (но некоторые реализации могут отклоняться) ярлыках для сигналов в терминале: /questions/44387648/kto-menyaet-moj-dom/44387674#44387674
Обновление: gopass мешает вашей обработке сигналов. Взгляните на использование http://godoc.org/code.google.com/p/go.crypto/ssh/terminal вместо этого:
state, err := terminal.MakeRaw(0)
if err != nil {
log.Fatal(err)
}
defer terminal.Restore(0, state)
term := terminal.NewTerminal(os.Stdout, ">")
password, err := term.ReadPassword("Enter password: ")
if err != nil {
log.Fatal(err)
}