想到这样一个需求:
在一个终端命令(如Linux服务器)程序进行中,想监听用户的快捷键,应对快捷键做一些动作.现在我可以对ctrl+c这种信号做一些判断,包括kill -10 这些信号做处理.但是否有办法接收更多的快捷方式.
如: 在一个多并发的程序进行中,监听用户的ctrl+p,就可以wait,暂停当前的过程,并且再通过询问,或者快捷键再决定是继续或者退出.
是否有好的办法,或者hacker的方式满足需求也行,先多谢!!!
PS: google到的是说跟terminal有很大关系,而且widnows的不好弄.
但我还是想两者都能支持,或者说接收两次ctrl+c才算是结束,一次是询问是否还有继续,如果继续就恢复,如果不继续就执行退出的相关操作. 不知道这个方式是否可行.(多线程的方式)
https://groups.google.com/forum/#!topic/golang-nuts/EyHBO-K_p8c
给一个极度 hack 的方案,不推荐真的这么做,但是是可以 work 的。主要做法就是用 stty 改变 /dev/tty 的设置,让程序可以立即读到 tty 的每一个字符的输入,同时禁用屏幕回显。
package main
import (
"os"
"os/exec"
"fmt"
)
func main() {
// set tty input buffer to 1 char and disable echo.
// HACK: exec command twice to make sure it will work on both mac and linux.
exec.Command("/bin/stty", "-f", "/dev/tty", "-icanon", "min", "1", "-echo").Run()
exec.Command("/bin/stty", "-F", "/dev/tty", "-icanon", "min", "1", "-echo").Run()
// read input directly from tty.
f, e := os.Open("/dev/tty")
if e != nil {
panic("cannot open /dev/tty. error: " + e.Error())
}
// a deadloop reading tty to demo concept.
var buf [1]byte
for {
n, e := f.Read(buf[:])
if e != nil || n == 0 {
break
}
fmt.Printf("Got input: 0x%x\n", buf[0])
}
}
P.S. 执行完这个程序后记得手动执行 stty echo
,要不然,嘿嘿〜