Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>Go by Example: Signals</title> | |
| <link rel=stylesheet href="site.css"> | |
| </head> | |
| <script type="text/javascript"> | |
| if (window.location.host == "gobyexample.com") { | |
| var _gaq = _gaq || []; | |
| _gaq.push(['_setAccount', 'UA-34996217-1']); | |
| _gaq.push(['_trackPageview']); | |
| (function() { | |
| var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | |
| ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | |
| var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | |
| })(); | |
| } | |
| </script> | |
| <body> | |
| <div class="example" id="signals"> | |
| <h2><a href="./">Go by Example</a>: Signals</h2> | |
| <table> | |
| <tr> | |
| <td class="docs"> | |
| <p>Sometimes we’d like our Go programs to intelligently | |
| handle <a href="http://en.wikipedia.org/wiki/Unix_signal">Unix signals</a>. | |
| For example, we might want a server to gracefully | |
| shutdown when it receives a <code>SIGTERM</code>, or a command-line | |
| tool to stop processing input if it receives a <code>SIGINT</code>. | |
| Here’s how to handle signals in Go with channels.</p> | |
| </td> | |
| <td class="code empty leading"> | |
| </td> | |
| </tr> | |
| <tr> | |
| <td class="docs"> | |
| </td> | |
| <td class="code leading"> | |
| <a href="http://play.golang.org/p/BlkqAtKsxo"><img title="Run code" src="play.png" class="run" /></a> | |
| <div class="highlight"><pre><span class="kn">package</span> <span class="nx">main</span> | |
| </pre></div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <td class="docs"> | |
| </td> | |
| <td class="code leading"> | |
| <div class="highlight"><pre><span class="kn">import</span> <span class="s">"fmt"</span> | |
| <span class="kn">import</span> <span class="s">"os"</span> | |
| <span class="kn">import</span> <span class="s">"os/signal"</span> | |
| <span class="kn">import</span> <span class="s">"syscall"</span> | |
| </pre></div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <td class="docs"> | |
| </td> | |
| <td class="code leading"> | |
| <div class="highlight"><pre><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span> | |
| </pre></div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <td class="docs"> | |
| <p>Go signal notification works by sending <code>os.Signal</code> | |
| values on a channel. We’ll create a channel to | |
| receive these notifications (we’ll also make one to | |
| notify us when the program can exit).</p> | |
| </td> | |
| <td class="code leading"> | |
| <div class="highlight"><pre> <span class="nx">sigs</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="nx">os</span><span class="p">.</span><span class="nx">Signal</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> | |
| <span class="nx">done</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="kd">chan</span> <span class="kt">bool</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> | |
| </pre></div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <td class="docs"> | |
| <p><code>signal.Notify</code> registers the given channel to | |
| receive notifications of the specified signals.</p> | |
| </td> | |
| <td class="code leading"> | |
| <div class="highlight"><pre> <span class="nx">signal</span><span class="p">.</span><span class="nx">Notify</span><span class="p">(</span><span class="nx">sigs</span><span class="p">,</span> <span class="nx">syscall</span><span class="p">.</span><span class="nx">SIGINT</span><span class="p">,</span> <span class="nx">syscall</span><span class="p">.</span><span class="nx">SIGTERM</span><span class="p">)</span> | |
| </pre></div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <td class="docs"> | |
| <p>This goroutine executes a blocking receive for | |
| signals. When it gets one it’ll print it out | |
| and then notify the program that it can finish.</p> | |
| </td> | |
| <td class="code leading"> | |
| <div class="highlight"><pre> <span class="k">go</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span> | |
| <span class="nx">sig</span> <span class="o">:=</span> <span class="o"><-</span><span class="nx">sigs</span> | |
| <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">()</span> | |
| <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">sig</span><span class="p">)</span> | |
| <span class="nx">done</span> <span class="o"><-</span> <span class="kc">true</span> | |
| <span class="p">}()</span> | |
| </pre></div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <td class="docs"> | |
| <p>The program will wait here until it gets the | |
| expected signal (as indicated by the goroutine | |
| above sending a value on <code>done</code>) and then exit.</p> | |
| </td> | |
| <td class="code"> | |
| <div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"awaiting signal"</span><span class="p">)</span> | |
| <span class="o"><-</span><span class="nx">done</span> | |
| <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"exiting"</span><span class="p">)</span> | |
| <span class="p">}</span> | |
| </pre></div> | |
| </td> | |
| </tr> | |
| </table> | |
| <table> | |
| <tr> | |
| <td class="docs"> | |
| <p>When we run this program it will block waiting for a | |
| signal. By typing <code>ctrl-C</code> (which the | |
| terminal shows as <code>^C</code>) we can send a <code>SIGINT</code> signal, | |
| causing the program to print <code>interrupt</code> and then exit.</p> | |
| </td> | |
| <td class="code"> | |
| <div class="highlight"><pre><span class="gp">$</span> go run signals.go | |
| <span class="go">awaiting signal</span> | |
| <span class="go">^C</span> | |
| <span class="go">interrupt</span> | |
| <span class="go">exiting</span> | |
| </pre></div> | |
| </td> | |
| </tr> | |
| </table> | |
| <p class="next"> | |
| Next example: <a href="exit">Exit</a>. | |
| </p> | |
| <p class="footer"> | |
| by <a href="https://twitter.com/mmcgrana">@mmcgrana</a> | <a href="mailto:mmcgrana@gmail.com">feedback</a> | <a href="https://github.com/mmcgrana/gobyexample/blob/master/examples/signals">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a> | |
| </p> | |
| </div> | |
| </body> | |
| </html> |