<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="function.pcntl-signal" xmlns="http://docbook.org/ns/docbook">
 <refnamediv>
  <refname>pcntl_signal</refname>
  <refpurpose>Installs a signal handler</refpurpose>
 </refnamediv>
 
 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <type>bool</type><methodname>pcntl_signal</methodname>
   <methodparam><type>int</type><parameter>signal</parameter></methodparam>
   <methodparam><type class="union"><type>callable</type><type>int</type></type><parameter>handler</parameter></methodparam>
   <methodparam choice="opt"><type>bool</type><parameter>restart_syscalls</parameter><initializer>&true;</initializer></methodparam>
  </methodsynopsis>
  <para>
   The <function>pcntl_signal</function> function installs a new
   signal handler or replaces the current signal handler for the signal indicated by <parameter>signal</parameter>.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>signal</parameter></term>
     <listitem>
      <para>
       The signal number.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>handler</parameter></term>
     <listitem>
      <para>
       The signal handler. This may be either a <type>callable</type>, which
       will be invoked to handle the signal, or either of the two global
       constants <constant>SIG_IGN</constant> or <constant>SIG_DFL</constant>,
       which will ignore the signal or restore the default signal handler
       respectively. 
      </para>
      <para>
       If a <type>callable</type> is given, it must implement the following
       signature:
      </para>
      <para>
       <methodsynopsis>
        <type>void</type><methodname><replaceable>handler</replaceable></methodname>
        <methodparam><type>int</type><parameter>signo</parameter></methodparam>
        <methodparam><type>mixed</type><parameter>siginfo</parameter></methodparam>
       </methodsynopsis>
       <variablelist>
        <varlistentry>
         <term><parameter>signal</parameter></term>
         <listitem>
          <simpara>
           The signal being handled.
          </simpara>
         </listitem>
        </varlistentry>
        <varlistentry>
         <term><parameter>siginfo</parameter></term>
         <listitem>
          <simpara>
           If operating systems supports siginfo_t structures, this will be an array of signal information dependent on the signal.
          </simpara>
         </listitem>
        </varlistentry>
       </variablelist>
      </para>
      <note>
       <para>
        Note that when you set a handler to an object method, that object's
        reference count is increased which makes it persist until you either
        change the handler to something else, or your script ends.
       </para>
      </note>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>restart_syscalls</parameter></term>
     <listitem>
      <para>
       Specifies whether system call restarting should be used when this
       signal arrives.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &return.success;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>7.1.0</entry>
       <entry>
        As of PHP 7.1.0 the handler callback is given a second argument
        containing the siginfo of the specific signal.  This data is only
        supplied if the operating system has the siginfo_t structure.
        If the OS does not implement siginfo_t NULL is supplied.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </para>
 </refsect1>

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title><function>pcntl_signal</function> example</title>
    <programlisting role="php">
<![CDATA[
<?php
// tick use required
declare(ticks = 1);

// signal handler function
function sig_handler($signo)
{

     switch ($signo) {
         case SIGTERM:
             // handle shutdown tasks
             exit;
             break;
         case SIGHUP:
             // handle restart tasks
             break;
         case SIGUSR1:
             echo "Caught SIGUSR1...\n";
             break;
         default:
             // handle all other signals
     }

}

echo "Installing signal handler...\n";

// setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");

// or use an object
// pcntl_signal(SIGUSR1, array($obj, "do_something"));

echo"Generating signal SIGUSR1 to self...\n";

// send SIGUSR1 to current process id
// posix_* functions require the posix extension
posix_kill(posix_getpid(), SIGUSR1);

echo "Done\n";

?>
]]>
    </programlisting>
   </example>
  </para>
 </refsect1>

 <refsect1 role="notes"><!-- {{{ -->
  &reftitle.notes;
  <para>
   <function>pcntl_signal</function> doesn't stack the signal handlers, but replaces them.
  </para>
 </refsect1><!-- }}} -->

 <refsect1 role="seealso">
  &reftitle.seealso;
  <para>
   <simplelist>
    <member><function>pcntl_fork</function></member>
    <member><function>pcntl_waitpid</function></member>
   </simplelist>
  </para>
 </refsect1>

</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
