title: Why can't Unix programs have signals with meaningful program defined names (rather than USR1, etc)?
body: <p>Many Unix programs accept signals like <code>USR1</code> and <code>USR2</code>. For example, to upgrade the executable for Nginx on the fly, you send <code>kill -USR2</code>.</p>
  
  <p>I understand that <code>USR1</code> is a "user defined" signal, meaning that whoever created the program can use it to mean "shut down" or "dump your logs" or "print foo a thousand times" or whatever. But I don't understand why they must use this arbitrary name. Why not <code>kill -UPGRADE</code>, or <code>kill -GRACEFUL_SHUTDOWN</code>? Does Unix only allow specific signals?</p>
  
  <p>While we're at it, Nginx also uses the following signals (see <a href="http://wiki.nginx.org/CommandLine" rel="noreferrer">documentation</a>):</p>
  
  <ul>
  <li><strong>TERM, INT</strong>: Quick shutdown</li>
  <li><strong>QUIT</strong>: Graceful shutdown</li>
  <li><strong>HUP</strong>: 
  
  <ul>
  <li>Configuration reload</li>
  <li>Start the new worker processes with a new configuration</li>
  <li>Gracefully shutdown the old worker processes</li>
  </ul></li>
  <li><strong>USR1</strong>: Reopen the log files</li>
  <li><strong>USR2</strong>: Upgrade Executable on the fly</li>
  <li><strong>WINCH</strong>: Gracefully shutdown the worker processes</li>
  </ul>
  
  <p>HUP? WINCH? What's the reason for these names? Where can I learn more about this?</p>