signal.NotifyContext: handling cancelation with Unix signals using context
Posted in Wednesday, 16 September 2020.
From Go 1.16 onwards, you’ll be able to use
to control context cancelation using Unix signals, simplifying handling operating system signals in Go for certain common cases. This is my first contribution to the Go standard library, and I am very excited!
When writing CLI code, I often needed to handle cancellation – for instance, when a user presses CTRL+C producing an interrupt signal. Another possible use case is to handle graceful termination of HTTP servers using
I had to write code using the signal package often and in multiple places. I didn’t want that, so I wrote the ctxsignal package to solve this common problem two years ago.
However, I kept finding it in other places and noticing people would often not handle proper termination correctly or at all, so I got motivated to submit a proposal and try to improve this situation.
How to use
This program will print
"missed signal" after 10 seconds or will print
"signal received" when the user sends an interruption signal, such as by pressing CTRL+C on a keyboard.
Please note that the second returned value of the
signal.NotifyContext function is a function called
stop instead of
cancel. Once you’re done handling a system signal, you should call
stop. We call it
stop instead of
cancel because you need to call it to stop capturing any further system signal you registered with
The stop function unregisters the signal behavior, which, like signal.Reset, may restore the default behavior for a given signal.
- I submitted a proposal and implementation on 17 February (as WithContext in the signal package).
- After some discussions, a somewhat modified proposal was accepted on 1 April as a WithCancelSignal in the context package.
- It was moved back to the proposal stage on 15 April after some concerns were presented about having it in the context package.
- After more discussions, it was accepted again on 20 May as NotifyContext in the signal package.
- A couple of days ago, I restarted working on it.
- Today it got merged and is available in the tip.
- Go 1.16 is expected to be released in February.
- I delayed working on it and missed the Go 1.15 release due to its code freeze window.
- Go uses Gerrit to track changes and code reviews.
- I found Gerrit’s patchsets better over GitHub’s pull-requests to keep track of changes without losing context (pun intended).
Thanks a lot to everyone who provided ideas, feedback, or code-reviewed my code. In particular, the Go team for the patience in helping me out.
If you click and buy any of these from Amazon after visiting the links above, I might get a commission from their Affiliate program.Tweet