当前位置:   article > 正文

golang 非正常退出信号捕捉处理_golang os.interrupt

golang os.interrupt

最近用golang写一个P2P程序,发现在安卓(arm linux )环境下按ctrl+c退出程序,占用udp端口不会在程序退出后自动释放

而普通x86/x64 Linux和win 不会出现这种情况

查阅资料 可以通过捕捉信号处理。

os.Interrupt(即syscall.SIGINT, Ctrl+C 产生)

os.Kill(即syscall.SIGKILL, 程序关闭产生,调试中还没捕获到过)

syscall.SIGTERM(kill 或者killall 产生)

修改程序,捕捉到信号通过chan传入exitHandle关闭处理

测试代码如下

  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. )
  9. var exitChan chan os.Signal
  10. var listener *net.UDPConn
  11. func exitHandle() {
  12. s := <-exitChan
  13. fmt.Println("收到退出信号", s)
  14. if listener != nil {
  15. listener.Close()
  16. fmt.Println("关闭listener")
  17. }
  18. os.Exit(1) //如果ctrl+c 关不掉程序,使用os.Exit强行关掉
  19. }
  20. func main() {
  21. exitChan = make(chan os.Signal)
  22. signal.Notify(exitChan, os.Interrupt, os.Kill, syscall.SIGTERM)
  23. go exitHandle()
  24. var err error
  25. listener, err = net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4zero, Port: 12345})
  26. if err != nil {
  27. panic(err)
  28. return
  29. }
  30. defer func() {
  31. fmt.Println("ctrl + c 退出不会执行到这里")
  32. listener.Close()
  33. }()
  34. //main body code
  35. for {
  36. data := make([]byte, 1024)
  37. n, remoteAddr, err := listener.ReadFromUDP(data)
  38. if err != nil {
  39. fmt.Printf("error during read: %s", err)
  40. }
  41. message := string(data[:n])
  42. fmt.Printf("receive:[%s] from:%s:%d\r\n", message, remoteAddr.IP.String(), remoteAddr.Port)
  43. }
  44. }

 

 linux可以使用kill -l 来查看当前系统的信号类型:
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

 

1:  "hangup",
2:  "interrupt",
3:  "quit",
4:  "illegal instruction",
5:  "trace/breakpoint trap",
6:  "aborted",
7:  "bus error",
8:  "floating point exception",
9:  "killed",
10: "user defined signal 1",
11: "segmentation fault",
12: "user defined signal 2",
13: "broken pipe",
14: "alarm clock",
15: "terminated",
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/108141
推荐阅读
相关标签
  

闽ICP备14008679号