我可以用signal package在go中捕获信号,但如何捕获从34(SIGRTMIN)到64(SIGRTMAX)的信号(包括link)呢?Golang称它们为“信号34”、“信号64”等,但这超出了重点。当我运行“pkill -34”时,我希望我的应用程序注意到它。
我可以在捕获所有信号时捕获它们:
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan)
然而,我不想捕捉所有的信号,我只想那些我之前提到的。
我还意识到,我可以捕捉个人信号,如:
signal.Notify(sigChan, os.Interrupt, syscall.SIGPOOL, syscall.SIGCLD ...)
但这需要信号常数,而我找不到对应于我想捕捉的信号的常数,有什么想法吗?
2条答案
按热度按时间vnjpjtjt1#
您可以只将新信号声明为
syscall.Signal
类型的类型化常量:signal.Notify
函数签名为:其中
os.Signal
是定义如下的接口:通常,您会使用
signal.Notify
函数,如范例所示:因此,如果我们在
syscall
包中检查这些常量的实现,我们会看到:其中,
syscall
包中的Signal
是一个已定义的类型:它只是一个底层的
int
,带有一个无操作Signal()
方法和Stringer实现。因此,您可以通过转换任意
int
值,以相同的方式为您想要捕获的信号声明自己的常量:pjngdqdw2#
根据所提供的输入,我制作了一个小片段,以轻松捕获所有SIGRT信号:
要使用它,请在一个终端窗口中运行此程序,并从另一个终端窗口向它发送一些信号。