signal_posix.go 881 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // +build !windows
  2. package prompt
  3. import (
  4. "os"
  5. "os/signal"
  6. "syscall"
  7. "github.com/c-bata/go-prompt/internal/debug"
  8. )
  9. func (p *Prompt) handleSignals(exitCh chan int, winSizeCh chan *WinSize, stop chan struct{}) {
  10. in := p.in
  11. sigCh := make(chan os.Signal, 1)
  12. signal.Notify(
  13. sigCh,
  14. syscall.SIGINT,
  15. syscall.SIGTERM,
  16. syscall.SIGQUIT,
  17. syscall.SIGWINCH,
  18. )
  19. for {
  20. select {
  21. case <-stop:
  22. debug.Log("stop handleSignals")
  23. return
  24. case s := <-sigCh:
  25. switch s {
  26. case syscall.SIGINT: // kill -SIGINT XXXX or Ctrl+c
  27. debug.Log("Catch SIGINT")
  28. exitCh <- 0
  29. case syscall.SIGTERM: // kill -SIGTERM XXXX
  30. debug.Log("Catch SIGTERM")
  31. exitCh <- 1
  32. case syscall.SIGQUIT: // kill -SIGQUIT XXXX
  33. debug.Log("Catch SIGQUIT")
  34. exitCh <- 0
  35. case syscall.SIGWINCH:
  36. debug.Log("Catch SIGWINCH")
  37. winSizeCh <- in.GetWinSize()
  38. }
  39. }
  40. }
  41. }