Skip to content

Instantly share code, notes, and snippets.

@ramirez7
Last active September 11, 2023 20:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ramirez7/d9da83bd1a743b9ea94d25947fe22eda to your computer and use it in GitHub Desktop.
Save ramirez7/d9da83bd1a743b9ea94d25947fe22eda to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"os"
"os/signal"
"sync/atomic"
"syscall"
)
func main() {
fmt.Println("start")
fmt.Println("pid =", os.Getpid())
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
done := make(chan bool, 100)
var n uint64 = 0
finish := func(s string) {
atomic.AddUint64(&n, 1)
fmt.Println("finish:", s, "n =", atomic.LoadUint64(&n))
}
go func() {
sig := <-sigs
fmt.Println()
fmt.Println(sig)
finish("sig handler")
done <- true
}()
defer finish("defer")
fmt.Println("awaiting signal")
wait := func () {
fmt.Println("in wait")
select {
case <- done:
fmt.Println("done pulled")
}
}
wait()
fmt.Println("exiting")
}
@ramirez7
Copy link
Author

ramirez7 commented Sep 11, 2023

$ go run signal-test.go 
start
pid = 2290876
awaiting signal
in wait
^C
interrupt
finish: sig handler n = 1
done pulled
exiting
finish: defer n = 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment