简答:
您可以将新信号声明为类型为 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)
syscall 包中的 Signal 是已定义类型:
// 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. */)