dtl85148 2015-01-26 11:24
浏览 64
已采纳

Go App无法捕获信号

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条回答 默认 最新

  • duanhai7274 2015-01-26 11:44
    关注

    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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog