按Ctrl + C退出Go程序

时间:2014-07-07 10:15:41

标签: go signals channel

使用 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 个答案:

答案 0 :(得分:3)

Ctrl-C是SIGINT。 Ctrl-\是SIGQUIT(默认情况下)。您将需要更改应用程序侦听的信号。

这个答案进一步详细说明了终端中信号的典型(但有些实现可能会偏离)快捷方式:https://superuser.com/a/343046/93194


更新:gopass is interfering with your signal handling。请改用http://godoc.org/code.google.com/p/go.crypto/ssh/terminal#ReadPassword来代替:

    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)
    }