Instala un gestor de señales

# pcntl_signal

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_signal — Instala un gestor de señales

### Descripción

function pcntl_signal(int `$signal`, callable|int `$handler`, bool `$restart_syscalls` = `true`): bool

pcntl_signal() instala un nuevo gestor de señales o reemplaza el gestor de señales actual para la señal indicada por el parámetro `signal`.

### Parámetros

`signal`

  El número de la señal.

`handler`

  El gestor de señales. Puede ser un callable, que será llamado para gestionar la señal, o bien una de las dos constantes globales `SIG_IGN` o `SIG_DFL`, que, respectivamente, ignorarán la señal o restaurarán el gestor de señales por defecto.

  Si se proporciona un callable, debe implementar la siguiente firma:

  function handler(int `$signo`, mixed `$siginfo`): void
  `signal`
    La señal a gestionar.
  `siginfo`
    Si el sistema operativo soporta las estructuras siginfo_t, esto será un array de información de la señal que depende de la señal.

  > Nota:

  > Téngase en cuenta que cuando se configura el gestor con un método de objeto, el contador de referencia del objeto se incrementa, lo que lo hace persistente hasta que se cambie el gestor de señales por otro, o hasta que el script termine.

`restart_syscalls`

  Especifica si la llamada al sistema de reinicio (restarting) debe ser utilizada cuando llega esta señal.

### Valores devueltos

Esta función retorna `true` en caso de éxito o `false` si ocurre un error.

### Historial de cambios

Versión | Descripción
--- | ---
7.1.0 | A partir de PHP 7.1.0 el gestor de la función de retrollamada tiene un segundo argumento que contiene el siginfo de esa señal específica. Estos datos solo se proporcionan si el sistema operativo tiene la estructura siginfo_t. Si el sistema operativo no implementa siginfo_t, se proporciona NULL.

### Ejemplos

Ejemplo #1 Ejemplo con pcntl_signal()

    <?php
    pcntl_async_signals(true);

    // gestor de señales del sistema
    function sig_handler($signo)
    {

         switch ($signo) {
             case SIGTERM:
                 // gestión de la extinción
                 exit;
                 break;
             case SIGHUP:
                 // gestión del reinicio
                 break;
             case SIGUSR1:
                 echo "Recibida la señal SIGUSR1...\n";
                 break;
             default:
                 // gestión de otras señales
         }

    }

    echo "Instalación del gestor de señales...\n";

    // Instalación de los gestores de señales
    pcntl_signal(SIGTERM, "sig_handler");
    pcntl_signal(SIGHUP,  "sig_handler");
    pcntl_signal(SIGUSR1, "sig_handler");

    // o bien utilice un objeto
    // pcntl_signal(SIGUSR1, array($obj, "hacer_algo"));

    echo"Generación de una señal SIGUSR1 a mí mismo...\n";

    // envío de SIGUSR1 al identificador de proceso actual
    // las funciones posix_* requieren la extensión posix
    posix_kill(posix_getpid(), SIGUSR1);

    echo "Hecho\n";

    ?>

### Notas

La función pcntl_signal() no apila los gestores de señales, sino que los reemplaza.

#### Método de dispatch

Existen varios métodos para dispatchar los gestores de señales:

- Dispatch asíncrono con pcntl_async_signals() activado. Este es el método recomendado
- Establecer la frecuencia de los ticks
- Dispatch manual con pcntl_signal_dispatch()

Cuando las señales son dispatchadas de manera asíncrona o utilizando una ejecución basada en ticks, las funciones bloqueantes como sleep() pueden ser interrumpidas.

### Ver también

- » Signal (IPC) en Wikipedia
- pcntl_async_signals() - Activa/desactiva la gestión asíncrona de las señales o devuelve el antiguo parámetro
- pcntl_fork() - Duplica el proceso actual
- pcntl_signal_dispatch() - Llama a los gestores de señales para cada señal en espera
- pcntl_waitpid() - Espera la finalización de la ejecución de un proceso hijo

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open