英文:
Go app cannot catch signals
问题
从Linux上发送信号的方法是使用kill
命令,可以使用以下命令发送信号2或15给指定的进程ID(PID):
kill -s 2 <PID>
或者 kill -s 15 <PID>
上述代码是一个Go语言程序,它演示了如何在程序中处理信号。程序中创建了两个通道(sigs
和done
),并使用signal.Notify
函数注册了所有信号。然后,程序启动了一个goroutine来等待信号的到来,并在接收到信号后打印出信号的信息。主函数中打印了"waiting",然后通过<-done
语句来阻塞程序的执行,直到接收到一个值。最后,程序打印"exiting"并退出。
需要注意的是,上述程序只是演示了如何接收信号,并没有实际处理信号的逻辑。只有按下CTRL+C
键时,程序才会正常退出。
英文:
Sending signals from kill on linux,
kill -s 2 <PID>
or kill -s 15 <PID>
The code is:
package main
import (
"fmt"
"os"
"os/signal"
)
func main() {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs)
go func() {
sig := <-sigs
fmt.Println(sig)
}()
fmt.Println("waiting")
<-done
fmt.Println("exiting")
}
The program does not handle signals,
only CTRL+C
works well.
答案1
得分: 1
func()
在接收到第一个信号后终止,我认为你尝试时使用了CTLR+C
作为第一个信号。当它被包裹在一个循环中时,它是有效的。
package main
import (
"fmt"
"os"
"os/signal"
)
func main() {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs)
go func() {
for {
sig := <-sigs
fmt.Println(sig)
}
}()
fmt.Println("waiting")
<-done
fmt.Println("exiting")
}
使用以下命令进行测试:
$ kill -15 <pid>
$ kill -2 <pid>
$ kill -10 <pid>
$ kill -1 <pid>
$ kill -10 <pid>
$ ./signal
waiting
terminated
interrupt
user defined signal 1
hangup
user defined signal 1
英文:
func()
is terminated after receiving the first signal, I think CTLR+C
was the first one when you try. It works when it is wrapped in a loop.
package main
import (
"fmt"
"os"
"os/signal"
)
func main() {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs)
go func() {
for {
sig := <-sigs
fmt.Println(sig)
}
}()
fmt.Println("waiting")
<-done
fmt.Println("exiting")
}
Tested with;
$ kill -15 <pid>
$ kill -2 <pid>
$ kill -10 <pid>
$ kill -1 <pid>
$ kill -10 <pid>
$ ./signal
waiting
terminated
interrupt
user defined signal 1
hangup
user defined signal 1
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论