Go应用程序无法捕获信号。

huangapple go评论78阅读模式
英文:

Go app cannot catch signals

问题

从Linux上发送信号的方法是使用kill命令,可以使用以下命令发送信号2或15给指定的进程ID(PID):

kill -s 2 <PID> 或者 kill -s 15 <PID>

上述代码是一个Go语言程序,它演示了如何在程序中处理信号。程序中创建了两个通道(sigsdone),并使用signal.Notify函数注册了所有信号。然后,程序启动了一个goroutine来等待信号的到来,并在接收到信号后打印出信号的信息。主函数中打印了"waiting",然后通过<-done语句来阻塞程序的执行,直到接收到一个值。最后,程序打印"exiting"并退出。

需要注意的是,上述程序只是演示了如何接收信号,并没有实际处理信号的逻辑。只有按下CTRL+C键时,程序才会正常退出。

英文:

Sending signals from kill on linux,
kill -s 2 &lt;PID&gt; or kill -s 15 &lt;PID&gt;

The code is:

package main

import (
  &quot;fmt&quot;
   &quot;os&quot;
   &quot;os/signal&quot;
)

func main() {
	sigs := make(chan os.Signal, 1)
	done := make(chan bool, 1)
	signal.Notify(sigs)
	go func() {
		sig := &lt;-sigs
		fmt.Println(sig)
	}()
	fmt.Println(&quot;waiting&quot;)
	&lt;-done
	fmt.Println(&quot;exiting&quot;)
}

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 (
  &quot;fmt&quot;
   &quot;os&quot;
   &quot;os/signal&quot;
)

func main() {
    sigs := make(chan os.Signal, 1)
    done := make(chan bool, 1)
    signal.Notify(sigs)
    go func() {
        for {
            sig := &lt;-sigs
            fmt.Println(sig)
        }
    }()
    fmt.Println(&quot;waiting&quot;)
    &lt;-done
    fmt.Println(&quot;exiting&quot;)
}

Tested with;

$ kill -15 &lt;pid&gt;
$ kill -2 &lt;pid&gt;
$ kill -10 &lt;pid&gt;
$ kill -1 &lt;pid&gt;
$ kill -10 &lt;pid&gt;

$ ./signal 
waiting
terminated
interrupt
user defined signal 1
hangup
user defined signal 1

huangapple
  • 本文由 发表于 2015年1月26日 19:24:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/28149165.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定