2 回答

TA贡献1772条经验 获得超5个赞
简短的回答:
您可以将新信号声明为 type 的类型化常量syscall.Signal:
const (
SIGRTMIN = syscall.Signal(0x22)
)
长答案(它是如何工作的):
signal.Notify函数签名是:
Notify(c chan<- os.Signal, sig ...os.Signal)
哪里os.Signal是这样定义的接口:
// A Signal represents an operating system signal.
// The usual underlying implementation is operating system-dependent:
// on Unix it is syscall.Signal.
type Signal interface {
String() string
Signal() // to distinguish from other Stringers
}
通常你会使用signal.Notify你的例子中的函数:
signal.Notify(sigChan, os.Interrupt, syscall.SIGPOOL, syscall.SIGCLD ...)
因此,如果我们检查包中这些常量的实现,syscall我们会看到:
SIGKILL = Signal(0x9)
包中的 thisSignal是syscall定义的类型:
// A Signal is a number describing a process signal.
// It implements the os.Signal interface.
type Signal int
func (s Signal) Signal() {}
func (s Signal) String() string {
// ... a few lines of code
}
它只是一个int带有无操作Signal()方法和 Stringer 实现的底层。
int因此,您可以通过转换任意值来为要捕获的信号以相同的方式声明自己的常量:
const (
SIGRTMIN = syscall.Signal(0x22)
)
signal.Notify(sigChan, SIGRTMIN, /* etc. */)

TA贡献1893条经验 获得超10个赞
- - - - - - - - - - - - - 回答 - - - - - - - - - - - - ---
由于 [blackgreen][3],此问题已得到解决。
我制作了一个小片段来轻松捕获所有 SIGRT 信号:
package main
import (
"fmt"
"syscall"
"os/signal"
"os"
)
func getSIGRTchannel() chan os.Signal {
sigChan := make(chan os.Signal, 1)
sigArr := make([]os.Signal, 31)
for i := range sigArr {
sigArr[i] = syscall.Signal(i + 0x22)
}
signal.Notify(sigChan, sigArr...)
return sigChan
}
func main() {
c := getSIGRTchannel()
// Block until a signal is received.
for {
s := <-c
fmt.Println("Got signal:", s)
}
}
要使用它,请在一个终端窗口中运行该程序并从另一个终端窗口向它发送一些信号。
- 2 回答
- 0 关注
- 175 浏览
添加回答
举报