Выйти из программы 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)
    }
Другие вопросы по тегам