2 回答

TA貢獻1772條經(jīng)驗 獲得超5個贊
簡短的回答:
您可以將新信號聲明為 type 的類型化常量syscall.Signal:
const (
SIGRTMIN = syscall.Signal(0x22)
)
長答案(它是如何工作的):
signal.Notify函數(shù)簽名是:
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你的例子中的函數(shù):
signal.Notify(sigChan, os.Interrupt, syscall.SIGPOOL, syscall.SIGCLD ...)
因此,如果我們檢查包中這些常量的實現(xiàn),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 實現(xiàn)的底層。
int因此,您可以通過轉換任意值來為要捕獲的信號以相同的方式聲明自己的常量:
const (
SIGRTMIN = syscall.Signal(0x22)
)
signal.Notify(sigChan, SIGRTMIN, /* etc. */)

TA貢獻1893條經(jīng)驗 獲得超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)
}
}
要使用它,請在一個終端窗口中運行該程序并從另一個終端窗口向它發(fā)送一些信號。
- 2 回答
- 0 關注
- 165 瀏覽
添加回答
舉報