我正在尝试在 golang 中捕获 ctrl+c、ctrl+z、ctrl+\等信号,并将其等效的十六进制代码写入 websocket。我正在做类似下面的事情。
func (c *poc) writePump() {
var b = make([]byte, 1)
d := make(chan os.Signal, 1)
signal.Notify(d, syscall.SIGINT, syscall.SIGTSTP, syscall.SIGQUIT)
for {
os.Stdin.Read(b)
err = c.ws.WriteMessage(websocket.TextMessage, b)
go func() {
for {
s := <-d
err = cli.sendControlSignalToWebsockets(s)
}
}()
if err != nil {
log.Printf("Failed to send UTF8 char: %s", err)
}
}
}
func (c *poc) sendControlSignalToWebsockets(s os.Signal) error {
var err error
switch s {
case syscall.SIGINT:
err = c.ws.WriteMessage(websocket.TextMessage, []byte{'\003'})
case syscall.SIGTSTP:
err = c.ws.WriteMessage(websocket.TextMessage, []byte{'\x1a'})
case syscall.SIGQUIT:
err = c.ws.WriteMessage(websocket.TextMessage, []byte{'\x1c'})
}
if err != nil {
return err
}
return nil
}
相反,我想做类似的事情,捕获所有信号,而不是将每个信号硬编码为十六进制代码,而是将信号转换为十六进制代码。
func (c *poc) writePump() {
var b = make([]byte, 1)
d := make(chan os.Signal, 1)
signal.Notify(d)
for {
os.Stdin.Read(b)
err = c.ws.WriteMessage(websocket.TextMessage, b)
go func() {
for {
s := <-d
//???? do some conversions and write it to websocket
}
}()
if err != nil {
log.Printf("Failed to send UTF8 char: %s", err)
}
}
}
很想知道是否有人有任何想法。谢谢!
最佳答案
听起来您正在尝试通过 websocket 传递信号。因此,您需要一种编码方式,不会与其他字符混淆,因此使用不可打印的 ascii 字符是一个合理的举措。
由于没有将 syscall
信号映射到 byte
的约定,您不能只导入它 - 但好消息! - 你可以创建自己的!
创建一个 map[syscall.Signal]byte
或 map[os.Signal]byte
并从那里进行转换:
// Create a mapping between syscalls and bytes
var syscallByteMap = map[syscall.Signal]byte{
syscall.SIGINT: '\003',
...more here...
}
...truncated...
go func() {
for {
s := <-d
// Look up the signal in the map
b, ok := syscallByteMap[s]
if ok {
err = c.ws.WriteMessage(websocket.TextMessage, []byte{b})
} else {
err = nil
}
}
}()
关于go - 在golang中将控制信号转换为字节ascii十六进制代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48914378/